复杂链表的复制
2018-02-26 17:45
127 查看
1、题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)2、代码和思路
2.1思路:将原始链表的每个节点的后面新建一个和该结点值一样的结点并插入到该结点的后面;再复制每个节点的随机指向指针的指向;最后从混合链表中分离出复制后的链表。算法步骤如下;
(1)遍历原始链表的每个节点,对于每个节点新创建一个节点,其值为当前结点的值,并将新创建结点插到当前节点的后面。
(2)遍历插入创建节点后的原始链表,为每个创建的结点赋值其随机指向指针的值。
(3)从最后形成的混合链表中的分离出最后需要的复制后的链表。(注意:最后这一步分离后需要保证原始链表和没复制前一样)
2.2代码:
class Solution { public: RandomListNode* Clone(RandomListNode* pHead) { if(pHead==NULL) return NULL; RandomListNode* p = pHead; RandomListNode* pTemp = NULL; //将链表全部复制一遍,但是只复制了正向的,没有复制随机指向 while(p) { RandomListNode* pNewNode = new RandomListNode(p->label); pTemp = p->next; p->next = pNewNode; pNewNode->next=pTemp; p=pTemp; } //复制随机指向 p=pHead; while(p) { if(p->random) p->next->random = p->random->next; //复制随机指向的指针 p=p->next->next; //连续向下两个节点 } //从混合链表中拆出复制后的链表 //需要注意的是:拆分后原链表不能变 //1找到复制链表的头指针 RandomListNode* pNodeClone, *pHeadClone, *pNode; pNodeClone = pHeadClone = pHead->next; pNode = pNodeClone->next; pHead->next = pNode; //2拆分,先为next指针赋值,再为节点指针赋值 while(pNode) { pNodeClone->next = pNode->next; pNodeClone = pNodeClone->next; pNode->next = pNodeClone->next; pNode = pNode->next; } return pHeadClone; } };
难点分析:
(1)首先需要想到这个思路,链表复制中最难的是每个节点随机指向指针的地址的复制,这是难点。所以要先插入复制整个链表,这样方便复制节点的随机指向指针的地址。(2)链表操作:涉及到链表的操作,设计的next等操作容易出错。这里总结一个小经验:涉及链表的操作,总是先为next指针赋值,再将next的值赋值给新的结点指针,因为先为next指针赋值,可以先保证链表的连贯性,指向的连贯。
(3)链表拆分是难点,需要保证拆分后的原始链表不变。