码迷,mamicode.com
首页 > 其他好文 > 详细

复杂链表的复制

时间:2017-12-25 13:34:09      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:复制   描述   clone   col   null   注意   span   scribe   next   

题目描述

  输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
  思路:N‘连接在N的后面,可以以O(n)的时间复制特殊指针的指向,再将两个链表分离
 1 class Solution {
 2 public:
 3     void CloneNodes(RandomListNode *pHead)
 4     {
 5         while(pHead)
 6         {
 7             RandomListNode *tmp=new RandomListNode(pHead->label);
 8             tmp->next=pHead->next;
 9             pHead->next=tmp;
10             pHead=tmp->next;
11         }
12     }
13     void CloneRandomNodes(RandomListNode *pHead)
14     {
15         while(pHead)
16         {
17             if(pHead->random)pHead->next->random=pHead->random->next;
18             else pHead->next->random=NULL;
19             pHead=pHead->next->next;
20         }
21     }
22     RandomListNode * ReconnectNodes(RandomListNode *pHead)
23     {
24         RandomListNode *newHead=NULL;
25         RandomListNode *tmp=NULL;
26         if(pHead)
27         {
28             newHead=pHead->next;
29             tmp=newHead;
30             pHead->next=newHead->next;
31             pHead=pHead->next;
32         }
33         while(pHead)
34         {
35             tmp->next=pHead->next;
36             tmp=tmp->next;
37             pHead->next=tmp->next;
38             pHead=pHead->next;
39         }
40         return newHead;
41     }
42     RandomListNode* Clone(RandomListNode* pHead)
43     {
44         CloneNodes(pHead);//复制所有节点
45         CloneRandomNodes(pHead);//复制特殊指针指向关系
46         return ReconnectNodes(pHead);//分离两个链表
47     }
48 };

  好吧,递归的写法竟然会超时

 1 class Solution {
 2 public:
 3     void CloneNodes(RandomListNode *pHead)
 4     {
 5         if(pHead==NULL)return;
 6         RandomListNode *tmp=new RandomListNode(pHead->label);
 7         tmp->next=pHead->next;
 8         pHead->next=tmp;
 9         CloneNodes(tmp->next);
10     }
11     void CloneRandomNodes(RandomListNode *pHead)
12     {
13         while(pHead)
14         {
15             if(pHead->random)pHead->next->random=pHead->random->next;
16             else pHead->next->random=NULL;
17             pHead=pHead->next->next;
18         }
19     }
20     RandomListNode * ReconnectNodes(RandomListNode *pHead)
21     {
22         if(pHead==NULL)return NULL;
23         RandomListNode *tmpHead=pHead->next;
24         pHead->next=tmpHead->next;
25         tmpHead->next=ReconnectNodes(pHead->next);
26         return tmpHead;
27     }
28     RandomListNode* Clone(RandomListNode* pHead)
29     {
30         CloneNodes(pHead);
31         CloneRandomNodes(pHead);
32         return ReconnectNodes(pHead);
33     }
34 };

 

复杂链表的复制

标签:复制   描述   clone   col   null   注意   span   scribe   next   

原文地址:http://www.cnblogs.com/jeysin/p/8108755.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!