剑指offer题解C++【25】复杂链表的复制
2017-08-14 16:54
573 查看
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路
原始链表:A->B->C->D->…1 复制每个节点的内容为pnew,并放在相应节点之后(p->next),即
A->A’->B->B’->C->C’->D->D’->…
2 设置random节点的内容:以A为例,假设A的random节点指向C,那么A’的random节点应该指向C’,即
A->next->random=A’->random=C’=C->next=A->random->next
即p->next->random=p->random->next
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) { RandomListNode* p=pHead; RandomListNode* pnext=nullptr; RandomListNode* pnew=nullptr; while(p){ pnext=p->next; pnew = new RandomListNode(p->label); p->next=pnew; pnew->next=pnext; p=pnext; } p=pHead; while(p){ if(p->random){ p->next->random=p->random->next; } p=p->next->next; } p=pHead; RandomListNode myHead(0); RandomListNode * pstart=&myHead; while(p){ pstart->next=p->next; pstart=pstart->next; pnext=p->next->next; p->next=pnext; p=pnext; } return myHead.next; } };
相关文章推荐
- (C++)剑指offer-25:复杂链表的复制(分解让复杂问题简单)(再理解)
- 【剑指offer】25复杂链表的复制
- 剑指offer之面试题25:复杂链表的复制
- 剑指offer题解 复杂链表的复制
- 剑指offer-25.复杂链表的复制
- 剑指offer第二十五题【复杂链表的复制】c++实现
- 剑指Offer——(25)复杂链表的复制
- 剑指offer-25-js-复杂链表的复制
- [剑指Offer] 25.复杂链表的复制
- 【剑指offer-解题系列(25)】复杂链表的复制
- 剑指Offer_25_复杂链表的复制
- 剑指offer复杂链表复制
- 剑指offer-4-面试26:复杂链表的复制
- 剑指offer:复杂链表的复制(java)
- 剑指offer-复制复杂链表
- 剑指offer 26 - 复杂链表的复制
- 剑指Offer26:复杂链表的复制
- 剑指offer面试题25:合并两个排序的链表(c++ 递归+非递归)
- 剑指offer——面试题26:复杂链表的复制
- 剑指offer 复杂链表的复制