《剑指offer》复杂链表的复制

一、题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

二、输入描述

输入一个复杂链表

三、输出描述

返回复制复杂链表

四、牛客网提供的框架

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {

    }
};

五、解题思路

分两步处理:
1、先复制单链表的指针与节点(next)
2、处理random指针。根据第一步得出来的链表,逐个求出每个节点的random指向的位置。
这里写图片描述

六、代码

class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        RandomListNode* newHead;    //新链表头结点
        if(!pHead) return NULL;

        newHead = new RandomListNode(pHead->label); //新建头结点
        RandomListNode* newCurrNode;    //辅助拷贝next指向的节点
        newCurrNode = newHead;

        /*
        * 复制next指针的链表
        */
        RandomListNode* oldNextNode;
        oldNextNode = pHead->next;
        while(oldNextNode)
        {
            RandomListNode* temp = new RandomListNode(oldNextNode->label);
            newCurrNode->next = temp;
            newCurrNode = newCurrNode->next;
            oldNextNode = oldNextNode->next;
        }


        /*
        *复制random指针
        *从链头开始,逐个找出每个节点random指针指向的节点位置。
        */
        RandomListNode* oldCurrNode;
        oldCurrNode = pHead;

        RandomListNode* newRandomCurrNode;
        newRandomCurrNode = newHead;
        while(oldCurrNode)  //逐个节点处理
        {
            int index = 0;
            RandomListNode* randomNode = oldCurrNode->random;   //节点oldCurrNode的random指针指向的节点
            RandomListNode* findeRandom = pHead;
            while(findeRandom != randomNode)    //找出oldCurrNode的random指针指向节点在链表中的下表
            {
                findeRandom = findeRandom->next;
                index++;
            }

            RandomListNode* newRandomNode;
            newRandomNode = newHead;
            while(index > 0)    //对复制后的链表,找出节点newRandomCurrNode的random指针指向节点的位置。
            {
                newRandomNode = newRandomNode->next;
                index--;
            }
            newRandomCurrNode->random = newRandomNode;
            oldCurrNode = oldCurrNode->next;
            newRandomCurrNode = newRandomCurrNode->next;
        }
        return newHead;
    }

};
posted @ 2016-07-19 20:00  chenximcm  阅读(151)  评论(0编辑  收藏  举报