剑指offer题目25:复杂链表的复制

题目描述

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

解答思路

如图是1个复杂链表的结构

正常的解答思路是先复制一遍链表,链表用next指针连起来,第二步再复制random指针。

解答的方法很是巧妙,分成三步。

  1. 复制链表而且和旧的链表连在一起。

  2. 使复制的链表指向原链表指向的节点的后1个节点,也就是random该指向的地方。

  3. 拆分链表为原链表和复制后的链表

实现代码

/*
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 == NULL) {
            return NULL;
        }
        RandomListNode* pNode = pHead;

        // 第一步 复制链表连在一起
        while(pNode) {
            RandomListNode* pNodeCopy = new RandomListNode(pNode->label);

            pNodeCopy->next = pNode->next;
            pNode->next = pNodeCopy;

            pNode = pNodeCopy->next;
        }

        // 第二步 复制链表的随机指针
        pNode = pHead;
        while(pNode) {
            pNode->next->random = pNode->random==NULL?NULL:pNode->random->next;
            pNode = pNode->next->next;
        }

        // 第三步 拆分链表
        pNode = pHead;
        RandomListNode* pHeadCopy = pHead->next;
        while(pNode) {
            RandomListNode* pNodeCopy = pNode->next;

            pNode->next = pNodeCopy->next;

            pNodeCopy->next = pNodeCopy->next==NULL?NULL:pNodeCopy->next->next;

            pNode = pNode->next;
        }

        return pHeadCopy;
    }
};
posted @ 2019-04-03 11:03  {-)大傻逼  阅读(142)  评论(0)    收藏  举报
欢迎转载,转载请注明本文地址。