复杂链表的复制

来源:互联网 发布:坏家伙的全盛时代 知乎 编辑:程序博客网 时间: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;}    };


原创粉丝点击