/* 题目: 实现一个函数,复制复杂链表,返回复制链表的头节点。 */ /* 思路: 第一步,复制一个链表S‘,插在原链表S中。 第二步,链表S’复制链表S的random指针。 第三步:拆分链表S和S‘。 */ #include<iostream> #include<string.h> #include<algorithm> #include<cmath> #include<stdio.h> #include<vector> #include<stack> #include<queue> using namespace std; struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; RandomListNode* Clone(RandomListNode* pHead) { if(pHead == nullptr) return pHead; //第一步,复制一个链表S‘,插在原链表S中。 RandomListNode* pNode = pHead; while(pNode){ RandomListNode* newNode = new RandomListNode(pNode->label); newNode->next = pNode->next; pNode->next = newNode; pNode = pNode->next->next; } //第二步,链表S’复制链表S的random指针。 pNode = pHead; RandomListNode* qNode = pHead->next; while(qNode->next && qNode->next->next){ if(pNode->random != nullptr){ qNode->random = pNode->random->next; } pNode = qNode->next; qNode = pNode->next; } if(pNode->random != nullptr) qNode->random = pNode->random->next; //第三步:拆分链表S和S‘。 pNode = pHead; qNode = pHead->next; RandomListNode* qHead = pHead->next; while(pNode){ pNode->next = qNode->next; if(qNode->next != nullptr){ qNode->next = qNode->next->next; } pNode = pNode->next; qNode = qNode->next; } return qHead; } int main(){ RandomListNode* node1 = new RandomListNode(1); RandomListNode* node2 = new RandomListNode(2); RandomListNode* node3 = new RandomListNode(3); node1->next = node2; node2->next = node3; node2->random = node1; RandomListNode* res = Clone(node1); while(res){ cout<<res->label<<endl; res = res->next; } }