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;
        }
    };
  • 相关阅读:
    轻量级Spring定时任务(Spring-task)
    Mysql语句优化建议
    python时间日期处理
    subprocess
    Tkinter初体验
    java基础
    java JVM
    NFV
    java加载properties文件的六种方法总结
    悲观锁和乐观锁的区别
  • 原文地址:https://www.cnblogs.com/iwangzhengchao/p/9968590.html
Copyright © 2011-2022 走看看