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

}

   

原文地址:https://www.cnblogs.com/buaaZhhx/p/11953965.html