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

       

  • 相关阅读:
    linux C++ 通讯架构(二)linux相关
    TCP/IP协议分层详解
    公网Ip和私网ip
    IP地址的含义
    IP地址,子网掩码、默认网关,DNS服务器是什么意思?
    Iptables&Firewalld防火墙
    Linux服务器性能评估与优化
    Linux性能优化
    基于mysql-proxy实现mysql读写分离
    linux下搭建NFS服务器
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11953965.html
Copyright © 2011-2022 走看看