• 剑指offer-面试题35-复杂链表的复制-链表


    /*
    题目:
    	实现一个函数,复制复杂链表,返回复制链表的头节点。
    */
    /*
    思路:
    	第一步,复制一个链表S‘,插在原链表S中。
    	第二步,链表S’复制链表S的random指针。
    	第三步:拆分链表S和S‘。
    */
    
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<cmath>
    #include<stdio.h>
    #include<vector>
    #include<stack>
    #include<queue>
    
    using namespace std;
    
    struct RandomListNode {
        int label;
        struct RandomListNode *next, *random;
        RandomListNode(int x) :
                label(x), next(NULL), random(NULL) {
        }
    };
    
    
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(pHead == nullptr) return pHead;
        //第一步,复制一个链表S‘,插在原链表S中。
        RandomListNode* pNode = pHead;
        while(pNode){
            RandomListNode* newNode = new RandomListNode(pNode->label);
            newNode->next = pNode->next;
            pNode->next = newNode;
            pNode = pNode->next->next;
        }
    
        //第二步,链表S’复制链表S的random指针。
        pNode = pHead;
        RandomListNode* qNode = pHead->next;
        while(qNode->next && qNode->next->next){
            if(pNode->random != nullptr){
                qNode->random = pNode->random->next;
            }
            pNode = qNode->next;
            qNode = pNode->next;
        }
        if(pNode->random != nullptr)
            qNode->random = pNode->random->next;
    
        //第三步:拆分链表S和S‘。
        pNode = pHead;
        qNode = pHead->next;
        RandomListNode* qHead = pHead->next;
        while(pNode){
            pNode->next = qNode->next;
            if(qNode->next != nullptr){
                qNode->next = qNode->next->next;
            }
            pNode = pNode->next;
            qNode = qNode->next;
    
        }
    
        return qHead;
    
    
    
    
    }
    
    int main(){
        RandomListNode* node1 = new RandomListNode(1);
        RandomListNode* node2 = new RandomListNode(2);
        RandomListNode* node3 = new RandomListNode(3);
        node1->next = node2;
        node2->next = node3;
        node2->random = node1;
        RandomListNode* res = Clone(node1);
        while(res){
            cout<<res->label<<endl;
            res = res->next;
        }
    
    }
    

       

  • 相关阅读:
    裸裸的spfa~嘿嘿嘿!
    睡前1小时数学系列之-整除
    拓扑排序1.奖金
    拓扑排序
    SCU 1095运送物资(最短路)
    POJ1158 城市交通Traffic lights IOI 1999 (最短路)
    POI0109 POD (最短路)
    HN0I2000最优乘车 (最短路变形)
    FOJ1205 小鼠迷宫问题 (BFD+递推)
    CJOI 05新年好 (最短路+枚举)
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11953965.html
Copyright © 2020-2023  润新知