(C++)剑指offer-25:复杂链表的复制(分解让复杂问题简单)(再理解)
2018-02-14 13:47
633 查看
剑指offer-25:复杂链表的复制
目录
剑指offer-25复杂链表的复制目录
1问题描述
2问题解析
3题目答案
1问题描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
2问题解析
复杂链表:每个节点中有节点值,以及两个指针一个指向下一个节点,另一个特殊指针指向链表的任意一个节点或者NULL
3题目答案
(1)递归思想:把大问题转化若干子问题此题转化为一个头结点和除去头结点剩余部分,剩余部分操作和原问题一致
有争议
/* 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* pClonedHead=new RandomListNode(pHead->label); pClonedHead->next = pHead->next; pClonedHead->random = pHead->random; //递归其他节点 pClonedHead->next=Clone(pHead->next); return pClonedHead; } };
(2)
链接:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba?orderByHotValue=1&questionTypes=000100&mutiTagIds=580&page=1&onlyReference=false 来源:牛客网 class Solution { public: //复制原始链表的任一节点N并创建新节点N',再把N'链接到N的后边 void CloneNodes(RandomListNode* pHead) { RandomListNode* pNode=pHead; while(pNode!=NULL) { RandomListNode* pCloned=new RandomListNode(0); pCloned->label=pNode->label; pCloned->next=pNode->next; pCloned->random=NULL; pNode->next=pCloned; pNode=pCloned->next; } } //如果原始链表上的节点N的random指向S,则对应的复制节点N'的random指向S的下一个节点S' void ConnectRandomNodes(RandomListNode* pHead) { RandomListNode* pNode=pHead; while(pNode!=NULL) { RandomListNode* pCloned=pNode->next; if(pNode->random!=NULL) pCloned->random=pNode->random->next; pNode=pCloned->next; } } //把得到的链表拆成两个链表,奇数位置上的结点组成原始链表,偶数位置上的结点组成复制出来的链表 RandomListNode* ReConnectNodes(RandomListNode* pHead) { RandomListNode* pNode=pHead; RandomListNode* pClonedHead=NULL; RandomListNode* pClonedNode=NULL; //初始化 if(pNode!=NULL) { pClonedHead=pClonedNode=pNode->next; pNode->next=pClonedNode->next; pNode=pNode->next; } //循环 while(pNode!=NULL) { pClonedNode->next=pNode->next; pClonedNode=pClonedNode->next; pNode->next=pClonedNode->next; pNode=pNode->next; } return pClonedHead; } //三步合一 RandomListNode* Clone(RandomListNode* pHead) { CloneNodes(pHead); ConnectRandomNodes(pHead); return ReConnectNodes(pHead); } };
相关文章推荐
- 剑指offer题解C++【25】复杂链表的复制
- 【剑指offer】4.4分解让复杂问题简单化——面试题26:复杂链表的复制
- (C++)剑指offer-26:二叉搜索树与双向链表(分解让复杂问题简单)
- (C++)剑指offer-27:字符串的排列(分解让复杂问题简单)(没太懂)
- 剑指offer:(26)分解让复杂问题简单化 :复杂链表的复制
- 剑指offer第二十五题【复杂链表的复制】c++实现
- 剑指offer 算法 (分解让复杂问题简单)
- 剑指Offer——(25)复杂链表的复制
- 【剑指offer-解题系列(25)】复杂链表的复制
- 剑指offer之面试题25:复杂链表的复制
- 《剑指offer》刷题笔记(分解让复杂问题简单):复杂链表的复制
- 【剑指offer】4.4分解让复杂问题简单化——面试题27:二叉搜索树与双向链表
- 剑指offer-25-js-复杂链表的复制
- 剑指offer面试题26之复杂链表的复制问题
- 【剑指offer】25复杂链表的复制
- 剑指Offer_25_复杂链表的复制
- 剑指offer-25.复杂链表的复制
- 剑指offer 28题 【分解让复杂问题简单】字符串的排列
- [剑指Offer] 25.复杂链表的复制
- 剑指offer—复杂链表的复制