算法总结之 复制含有随机指针节点的链表

一种特殊的链表节点类描述如下:

public class Node{

public int value;

public Node next;

public Node rand;

public Node(int data){

this.value = data

}

}

rand指针是Node类中的新增的指针,这个指针可能指向链表中任意的一个节点,也可能指向null

首先介绍普通解法:

使用哈希表

首先从左到右遍历链表,对每个节点都复制生成相应的副本节点

key 1  value 1`

package TT;

import java.util.HashMap;

public class Test95 {

    public class Node{
        public int value;
        public Node next;
        public Node rand;

        public Node(int data){
            this.value=data;
        }

    }

    public Node copyListWithRand1(Node head){

        HashMap<Node, Node> map=new HashMap<Node, Node>();
        Node cur=head;
        while(cur != null){
            map.put(cur, new Node(cur.value));
            cur=cur.next;
        }
        cur=head;
        while(cur!=null){
            map.get(cur).next=map.get(cur.next);
            map.get(cur).rand=map.get(cur.rand);
            cur=cur.next;
        }
        return map.get(head);
    }

}
时间: 2024-11-07 07:04:15

算法总结之 复制含有随机指针节点的链表的相关文章

[程序员代码面试指南]链表问题-复制含有随机指针节点的链表(方法二待做)

问题描述 public class Node { public int val; public Node next; public Node rand; public Node(int data) { this.val=data; } } Node类中的value是节点值,next指针和正常单链表中next指针的意义一样,都指向下一个节点,rand指针是Node类中新增的指针,这个指针可能指向链表中的任意一个节点,也可能指向null. 给定一个由Node节点类型组成的无环单链表的头节点head,

左神算法基础班3_13深度拷贝含有随机指针的链表

Problem: 复制含有随机指针节点的链表 [题目] 一种特殊的链表节点类描述如下: public class Node { public int value; public Node next; public Node rand; public Node(int data) { this.value = data; } } Node类中的value是节点值,next指针和正常单链表中next指针的意义 一 样,都指向下一个节点,rand指针是Node类中新增的指针,这个指 针可 能指向链表中

【LeetCode-面试算法经典-Java实现】【138-Copy List with Random Pointer(拷贝有随机指针的单链表)】

[138-Copy List with Random Pointer(拷贝有随机指针的单链表)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list.

LeetCode138 Copy List with Random Pointer(深度复制带有随机指针的链表) Java题解

题目: A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 解题: 这题是要复制一个链表,这个链表比普通的链表多一个指针,这个指针可以指向任意地方,可以为空也可以为链表中的任一个节点,今天中午的时候我同学和我说起这题,当时问

Copy List with Random Pointer复制带有随机指针的链表

这道题目很经典,很多书和OJ里都有.如果初次遇到,一定很难搞定.再看其解法,实在是很惊艳. 有两个可以得到深刻启示的地方: (1)冗余的思想.谈到复制,我们往往都会另起炉灶,而不会原来链表上搞来搞去,感觉很复杂很危险,会一团糟.美错,最危险的地方就是最安全的地方. (2)指针的步伐.这里的指针有一走两步的操作,很容易导致RE.但是否意味着每步都要仔细考虑指针越界?不然,那样程序会写的很累很乱.还是按照最初的想法,谨慎实现之.回头查看特殊情况,例如空指针情况.只有一个节点的情况,用实际用例去测试,

[leetcode]138. Copy List with Random Pointer复制带有随机指针的链表

public RandomListNode copyRandomList(RandomListNode head) { /* 深复制,就是不能只是复制原链表变量,而是做一个和原来链表一模一样的新链表, 每一个节点都是新建的,而不是指向就节点 这个题的难点在于:随机节点. 随机节点有可能指向后边还没有建立的节点,这就没法指. 方法一:一一对应地记录每个新旧节点的映射关系,在常规节点建立后,就去查哈希表,找到对应 新节点的旧节点的random,就是新节点的random */ if (head==nu

LintCode(105) 复制带随机指针的链表

题目 复制带随机指针的链表 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. 分析 一个经典题目,思想就是在复制每个原节点链接其后,然后依次添加新节点的random指针. 遍历复制后的链表,删除原节点. 就不详述了,看代码,重点是练习Python实现~~~ Python代码 # Definition for singly-linked list with a random pointer. # class RandomListNode:

LintCode复制带随机指针的链表

中等 复制带随机指针的链表 查看运行结果 27% 通过 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. 用了一个哈希表,空间换取时间 /** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(

复制带随机指针的链表 &#183; Copy List with Random Pointer

[抄题]: 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [总结]: [复杂度]:Time complexity: O() Space complexity: O() [英文数据结构,为什么不用别的数据结构]: [其他解法]: [Follow Up]: [题目变变变]: 原文地址