复杂链表的复制

Posted Jeysin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复杂链表的复制相关的知识,希望对你有一定的参考价值。

题目描述

  输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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 };

 

以上是关于复杂链表的复制的主要内容,如果未能解决你的问题,请参考以下文章

复杂链表的复制

剑指offer 25.复杂链表的复制

数据结构复杂链表的复制

复杂链表的复制

python解决复杂链表的复制

复杂链表的复制