zoukankan      html  css  js  c++  java
  • 剑指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)
        {
            
        }
    };

    解题代码:

    class Solution {
        /**
         * 主要思路:
         * 原链表为 A->B->C
         * 将每个节点node克隆为node',同时将克隆节点和原节点穿插一起
         * 组成链表: A->A'->B->B'->C->C'
         * 然后将继续复制random指针,next指针在节点穿插的时候已经完成
         * 最后将完整(所有指针都已经维护完毕)的链表A->A'->B->B'->C->C'拆分为
         * A->B->C 和 A'->B'->C'
         */
    public:
        RandomListNode* Clone(RandomListNode* pHead) {
            if(pHead == NULL)
                return NULL;
    
            CloneNode(pHead);
            ConnectSlibingNode(pHead);
            return ReconnectNode(pHead);
        }
    private:
        // 将所有节点克隆,并交叉连接(不包括random指针)
        void CloneNode(RandomListNode* pHead){
            RandomListNode* p = pHead;
            while(p != NULL){
                RandomListNode* pClone = new RandomListNode(p->label);
                pClone->next = p->next;
                p->next = pClone;
                p = pClone->next;
            }
        }
        // 连接克隆节点的random指针
        void ConnectSlibingNode(RandomListNode* pHead){
            RandomListNode* p = pHead;
            RandomListNode* pClone = p->next;
            while(p != NULL){
                if(p->random != NULL)
                    pClone->random = p->random->next;
                p = pClone->next;
                pClone = p->next;
            }
        }
        //将含有原节点和克隆节点的链表拆分为原链表和由克隆节点组成的链表
        RandomListNode* ReconnectNode(RandomListNode* pHead){
            RandomListNode* p = pHead;
            RandomListNode* pClone = p->next;
            RandomListNode* pCloneHead = pClone;
            while(p->next != NULL){
                p->next = pClone->next;
                if(pClone->next != NULL){
                    p = p->next;
                    pClone->next = p->next;
                    pClone = pClone->next;
                }
            }
            return pCloneHead;
        }
    };
  • 相关阅读:
    [APM] OneAPM 云监控部署与试用体验
    Elastic Stack 安装
    xBIM 综合使用案例与 ASP.NET MVC 集成(一)
    JQuery DataTables Selected Row
    力导向图Demo
    WPF ViewModelLocator
    Syncfusion SfDataGrid 导出Excel
    HTML Table to Json
    .net core 2.0 虚拟目录下载 Android Apk 等文件
    在BootStrap的modal中使用Select2
  • 原文地址:https://www.cnblogs.com/iwangzhengchao/p/9968590.html
Copyright © 2011-2022 走看看