复杂链表的复制
来源:互联网 发布:坏家伙的全盛时代 知乎 编辑:程序博客网 时间:2024/06/10 21:01
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { }};
解题思路:
1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面,如下图;
原链表:A->B->C->D->E->F.
步骤1后:A->A1->B->B1->C->C1->D->D1->E->E1->F->F1.
2、重新遍历链表,复制老结点的随机指针给新结点,A1.random = A.random.next;
如链表中 A.random = C。 步骤2使得:A1.random = C.next = C1;
3、拆分链表,将链表拆分为原链表和复制后的链表
步骤3后得到:A->B->C->D->E->F. 和 A1->B1->C1->D1->E1->F1.
代码如下:
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) return NULL;//步骤1RandomListNode *currNode = pHead;while(currNode){RandomListNode *node = new RandomListNode(currNode->label);node->next = currNode->next;currNode->next = node;currNode = node->next;}//步骤2currNode = pHead;while(currNode){RandomListNode *node = currNode->next;if(currNode->random){ node->random = currNode->random->next;}currNode = node->next;}//拆分RandomListNode *pCloneHead = pHead->next;RandomListNode *tmp;currNode = pHead;while(currNode->next){tmp = currNode->next;currNode->next =tmp->next;currNode = tmp;}return pCloneHead;} };
阅读全文
1 0
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复制复杂的链表
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- Integer源码学习
- iOS
- 修改Linux文件权限命令:chmod
- dubbo程序jar包启动shell
- uC/OS-III之消息传递
- 复杂链表的复制
- Scrapy 爬虫程序
- SQL Server AlwaysOn 可用性组安装补丁SP步骤
- 解决:[16033:16033:0607/114040.917620:ERROR:browser_main_loop.cc(257)] GTK theme error: Unable to locat
- 二分查找--Java版
- [YTU]_2642 (填空题:类模板---求数组的最大值)
- ViewPager加ImageLoader图片轮播
- 使用gcov生成覆盖率时,提示version '402*', prefer '408*'
- fastclick.js