1 //复杂链表的复制 2 //输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 3 // 4 //思路:拷贝链表的结点,需要根据已知链表的结点的值,创建一个新的结点
5 struct RandomListNode 6 { 7 int label; 8 struct RandomListNode* next, *random; 9 RandomListNode(int x):label(x), next(NULL), random(NULL) 10 { 11 12 } 13 }; 14 class Solution 15 { 16 public: 17 RandomListNode* Clone(RandomListNode* pHead) 18 { 19 if (pHead == NULL) 20 { 21 return NULL; 22 } 23 ////第一步,创建结点然后并复制整个链表的结点---复制链表,需要遍历,因而需要创建链表的头结点 24 RandomListNode* pNode=pHead; 25 while(pNode != NULL) 26 { 27 RandomListNode* pCloned = new RandomListNode(pNode->label); 28 pCloned->next = pNode->next; 29 pNode->next = pCloned; 30 pNode = pCloned->next; 31 } 32 //若原始链表上的结点N的m_pSibling指向S,则它对应的复制结点N'的m_pSibling指向S的下一个结点S' 33 //第二步--再次对复制链表进行遍历 34 RandomListNode* pNode1 = pHead; 35 while(pNode1 != NULL) 36 { 37 RandomListNode* pCloned = pNode1->next; 38 if (pNode1->random != NULL) 39 { 40 pCloned->random = pNode1->random->next; 41 } 42 pNode1 = pCloned->next; 43 } 44 //第三步,将第二步得到的链表拆成两个链表,即奇数位置和偶数位置 45 RandomListNode* pTmp = NULL; 46 RandomListNode* pCurrentHead = pHead; 47 RandomListNode* pClonedHead = pHead->next; 48 //对复制链表进行拆分 49 //-首先再循环备份两个链表的头结点, 50 //然后循环判断条件就是头结点的下一个结点是否为NULL; 51 //先备份下一个要遍历的结点,然后再做操作;再将备份结点改编成当前要处理的结点。 52 while(pCurrentHead->next) 53 { 54 pTmp = pCurrentHead->next; 55 pCurrentHead->next = pTmp->next; 56 pCurrentHead = pTmp; 57 } 58 return pClonedHead; 59 } 60 };