复杂链表的复制

  题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。

  复杂链表的结构如下:

1 struct RandomListNode {
2     int label;
3     struct RandomListNode *next, *random;
4     RandomListNode(int x) :
5             label(x), next(NULL), random(NULL) {
6     }
7 };

  代码如下:

 1 RandomListNode* Clone(RandomListNode* pHead){
 2         if(!pHead) return NULL;
 3         RandomListNode *currNode = pHead;
 4         //复制原始链表的任意节点N并创建新节点N',并把N'连接到N的后面
 5         while(currNode){
 6             RandomListNode *node = new RandomListNode(currNode->label);
 7             node->next = currNode->next;
 8             currNode->next = node;
 9             currNode = node->next;
10         }
11         currNode = pHead;
12         
13         //如果原始链表上的节点N的random指向S,则它对应的复制节点N'的random指向S的下一个节点S'
14         while(currNode){
15             RandomListNode *node = currNode->next;
16             if(currNode->random){               
17                 node->random = currNode->random->next;
18             }
19             currNode = node->next;
20         }
21         //把第二步得到的链表拆分成两个链表,奇数位置上的节点组成原始链表,偶数位置上的节点组成复制出来的链表
22         RandomListNode *pCloneHead = pHead->next;
23         RandomListNode *tmp;
24         currNode = pHead;
25         while(currNode->next){
26             tmp = currNode->next;
27             currNode->next =tmp->next;
28             currNode = tmp;
29         }
30         return pCloneHead;
31 }

 

posted @ 2016-08-24 10:09  没长大的书生  阅读(138)  评论(2编辑  收藏  举报