/*
题目难点在特殊指针的指向,如何解决?
1.在每个节点后面添加一个新节点,(新节点和前面的那个节点一模一样)
2.新节点的特殊指针指向它前面节点特殊指针指向的节点的后一个节点
3.将链表拆分为两个链表,奇数为一个链表,偶数为一个链表
*/
/* 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==NULL){ return NULL; } RandomListNode* q = pHead; while(q!=NULL) { RandomListNode* q1 = new RandomListNode(q->label); q1->next = q->next; q->next = q1; q = q1->next; } //将特殊指针指好 RandomListNode* p = pHead; RandomListNode* p1 = pHead->next; while(p!=NULL) { if(p->random!=NULL){ p1->random = p->random->next; } p = p1->next; p1 = p->next; } //拆分链表 RandomListNode* newpHead = pHead->next; RandomListNode *tmp; RandomListNode* cur = pHead; while(cur->next){ tmp = cur->next; cur->next =tmp->next; cur = tmp; } return newpHead; } };
原文:https://www.cnblogs.com/loyolh/p/12343051.html