【数据结构】单链表--复杂链表的复制

来源:互联网 发布:淘宝店如何增加销量 编辑:程序博客网 时间:2024/06/05 02:34

 在学习链表的最后,我们接触了复杂链表。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。

 首先定义链表结构:

typedef struct ComplexNode//复杂链表的结构{DataType data;struct ComplexNode *_next;struct ComplexNode *_random;}ComplexNode;
  复杂链表的动态开辟,与主函数的测试:

ComplexNode *BuyComplexNode(DataType x)//复杂链表的动态开辟{ComplexNode *node = (ComplexNode*)malloc(sizeof(ComplexNode));node->data = x;node->_next = NULL;node->_random = NULL;return node;}//复杂链表的复制void TestList(){ComplexNode *node1 = BuyComplexNode(1);ComplexNode *node2 = BuyComplexNode(2);ComplexNode *node3 = BuyComplexNode(3);ComplexNode *node4 = BuyComplexNode(4);ComplexNode *node5 = BuyComplexNode(5);node1->_next = node2;node1->_random = node3;node2->_next = node3;node2->_random = node1;node3->_next = node4;node3->_random = NULL;node4->_next = NULL;node4->_random = node4;ComplexNode *node = CopyComNode(&node1);}int main(){TestList();return 0;}
 复杂链表复制的方法思想:



ComplexNode* CopyComNode(ComplexNode **ppList)//复制复杂链表{ComplexNode *cur = *ppList;ComplexNode *node = *ppList;//节点插在后面while (*ppList){ComplexNode *Node = BuyComplexNode((*ppList)->data);ComplexNode *tmp = (*ppList)->_next;(*ppList)->_next = Node;Node->_next = tmp;*ppList = tmp;}//新节点的random置好while (cur){if (cur->_random)cur->_next->_random = cur->_random->_next;elsecur->_next->_random = NULL;cur = cur->_next->_next;}//取出新节点ComplexNode *first = node->_next;*ppList = node;while (node){ComplexNode *tmp = node->_next;node->_next = node->_next->_next;if (tmp->_next)tmp->_next = tmp->_next->_next;elsetmp->_next = NULL;node = node->_next;}return first;}



原创粉丝点击