美文网首页LeetCode
复杂的链表的深度拷贝

复杂的链表的深度拷贝

作者: 徐凯_xp | 来源:发表于2018-03-08 01:28 被阅读9次

Copy List with Random Pointer
已知一个复杂的链表,节点中有一个指向本链表任意某个节点的碎甲指针(也可以为空),求这个链表的深度拷贝。

class Solution{
public:
    RandomListNode *copyRandomList(RandomListNode *head){
    }//返回时深度拷贝后的链表
};//深度拷贝:构造生成一个完全新的链表,即使将原链表毁坏,新链表可独立使用
必备知识,STL Map使用
#include <stdio.h>
#include<map>//STL map头文件
struct RandomListNode{//带有随机指针的链表节点
    int label;
    RandomListNode *next,*random;
    RandomListNode(int x): label(x),next(NULL),random(NULL){}
};
int main(){
    std :: map<RandomListNode *,int> node_map;
    RandomListNode a(5);
    RandomListNode b(3);
    RandomListNode c(6);
    a.next = &b;
    b.next = &c;
    a.random = &c;
    b.random = &a;
    c.ramdom = &c;
   //可以知道j节点位置,在什么位置
    node_map[&a] = 1;//a节点的地址映射为1
    node_map[&b] = 2;
    node_map[&c] = 3;
    printf("a.random id = %d\n",node_map[a.random]);
    printf("b.random id = %d\n",node_map[b.random]);
    printf("c.random id = %d\n",node_map[c.random]);
    return 0;
}
算法:节点地址与节点序号对应,两个映射

主要为了理清逻辑关系



class Solution{
public:
    RandListNode *copyRandomList(RandomListNode *head){
        std::map<RandomListNode*,int> node_map;//map1:地址到节点位置的map
        std::vector<RandomListNode *> node_vec;//map2:使用vector根据存储节点位置访问地址
        RandomListNode *ptr = head;
        int i = 0;
        while(ptr){//将新链表节点push入node_vec,生成了新链表节点位置到地址的map
            node_vec.push_back(new RandomListNode(ptr->label));
            node_map[ptr] = i;//记录原始链表地址至节点位置的node_map
            ptr = ptr->next;//遍历原始列表
            i++;//记录节点位置 
         }
        node_vec.push_back(0);//特殊处理链表最后一个节点。让链表处理和原来链表是一个统一的状态
        ptr = head;
        i = 0;//再次遍历原始列表,链接新链表的next指针、random指针
        while(ptr){
           node_vec[i]->next = node_vec[i+1];//链接新链表next指针
           if(ptr->random){//当random指针不为空
                   int id = node_map[ptr->random] //根据node_map确认
                   node_vec[i]->random = node_vec[id];原链表random指针指向的位置即id     
                                    } //链接新链表random指针
              ptr = ptr->next;
              i++;
                      }
            return node_vec[0];
    }
};

相关文章

  • 复杂的链表的深度拷贝

    Copy List with Random Pointer已知一个复杂的链表,节点中有一个指向本链表任意某个节点的...

  • 复杂链表的拷贝

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)...

  • leetcode刷题05--复杂的链表的深度拷贝--T138

    题目: 深度拷贝:构造一个完全新的链表,即使将原链表毁坏,新链表也可以独立使用 自己的思路:无.... 好吧看一下...

  • 深拷贝、浅拷贝

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • 面试题整理

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • iOS面试基础一

    #父类实现深拷贝时,子类如何实现深度拷贝.父类没有实现深拷贝时,子类如何实现深度拷贝.# <(1)深拷贝同浅拷贝的...

  • 剑指offer 35 拷贝复杂链表

    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向...

  • iOS知识点(一)

    1.1 父类实现深拷贝时,子类如何实现深度拷贝。 父类没有实现深拷贝时,子类如何实现深度拷贝。深拷贝同浅拷贝的区别...

  • 面试 (一) : 基础篇

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...

  • 基础

    1、父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅...

网友评论

    本文标题:复杂的链表的深度拷贝

    本文链接:https://www.haomeiwen.com/subject/rvfrfftx.html