• 剑指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;
        }
    
    }
    

       

  • 相关阅读:
    结对项目 sport club(一)
    结对项目 sport club(三)
    结对项目 sport club(二)
    博客作业
    学生信息管理系统APP需求分析
    随机生成四则运算
    软件介绍
    利用纯css写三角形,弧度箭头,吃豆人,气泡。放大镜,标签的源码
    js中的数据类型隐式转换的三种情况
    javascript基础入门之js中的结构分支与循环语句
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11953965.html
Copyright © 2020-2023  润新知