牛客网《剑指Offer》(25) 复杂链表的复制

题目描述

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

题目分析

复杂问题简单化,将该问题拆分成三步来实现,就简单多了。

1、遍历链表,复制链表中的每个结点,并将复制的结点插入到该结点的后面。例如,原链表为A->B->C, 遍历完毕后,链表变为A->A'->B->B'->C->C',其中A‘,B',C'是结点A,B,C的复制结点。

看图中,蓝色箭头为next指针:

  

复制结点后:

void CloneNode(RandomListNode* pHead)
    {//克隆节点
        RandomListNode* pNode = pHead;
        while(pNode != NULL)
        {
            RandomListNode* qNode = new RandomListNode(0);
            qNode ->label = pNode -> label;
            qNode -> next =  pNode -> next;
            //qNode -> random = pNode -> random;
            
            pNode ->next = qNode;
            pNode = qNode -> next;
        }
    }

2、为复制结点的random指针赋值

如果原结点的random指针指向的是结点B,那么将复制结点的random指针指向结点B的复制结点B'。

图中黑色箭头为random指针:

复制结点的random指针赋值后:

void CloneRandom(RandomListNode* pHead)
    {//克隆节点关系
        RandomListNode* pNode = pHead;
        RandomListNode* qNode = pHead;
        while(pNode != NULL)
        {
            qNode = pNode -> next;
            if(pNode -> random != NULL)
                qNode -> random = pNode -> random -> next;
            pNode = qNode -> next;
        }
    }

3、将链表的原始结点与复制结点分割至两个链表,使原始结点构成一个链表,复制结点构成一个链表。

 

RandomListNode* ResitNode(RandomListNode* pHead)
    {//断开新旧链表
        RandomListNode* pNode = pHead;
        RandomListNode* newHead = NULL;
        RandomListNode* newNode = NULL;
        
        if(pNode != NULL)
        {
            newHead = newNode = pNode -> next;
            pNode -> next = newNode -> next;
            pNode = pNode -> next;
        }
        while(pNode != NULL)
        {
            newNode -> next = pNode -> next;
            newNode = newNode -> next;
            pNode -> next = newNode -> next;
            pNode = pNode -> next;
        }
        return newHead;
    }

4、运行

RandomListNode* Clone(RandomListNode* pHead)
    {
        CloneNode(pHead);
        CloneRandom(pHead);
        return ResitNode(pHead);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章