复杂链表的复制

xiaoxiao2021-02-28  74

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。

struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } };

解题思路: 1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面,如下图原链表:A->B->C->D->E->F.  步骤1后:A->A1->B->B1->C->C1->D->D1->E->E1->F->F1.  2、重新遍历链表,复制老结点的随机指针给新结点,A1.random = A.random.next;  如链表中 A.random = C。 步骤2使得:A1.random = C.next = C1; 3、拆分链表,将链表拆分为原链表和复制后的链表 步骤3后得到:A->B->C->D->E->F. 和 A1->B1->C1->D1->E1->F1. 

代码如下:

struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { if(!pHead) return NULL; //步骤1 RandomListNode *currNode = pHead; while(currNode){ RandomListNode *node = new RandomListNode(currNode->label); node->next = currNode->next; currNode->next = node; currNode = node->next; } //步骤2 currNode = pHead; while(currNode){ RandomListNode *node = currNode->next; if(currNode->random){                node->random = currNode->random->next; } currNode = node->next; } //拆分 RandomListNode *pCloneHead = pHead->next; RandomListNode *tmp; currNode = pHead; while(currNode->next){ tmp = currNode->next; currNode->next =tmp->next; currNode = tmp; } return pCloneHead; } };

转载请注明原文地址: https://www.6miu.com/read-52684.html

最新回复(0)