复杂链表的复制(复制含有随机指针节点的链表)

原创 2016年08月29日 14:49:57

程序员代码面试指南(左程云)读书笔记

 第三章

复杂链表的复制(复制含有随机指针节点的链表)
题目:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
public class ListRandom {
 class RandomListNode {
        int label;
        RandomListNode next = null;
        RandomListNode random = null;

        RandomListNode(int label) {
            this.label = label;
        }
    }
方法一:
      用哈希表,将链表遍历一遍,key和value的值对应关系如下

然后再遍历一次链表,设置复制链表的next和random指针
  public RandomListNode Clone2(RandomListNode pHead)
        {
          HashMap<RandomListNode, RandomListNode> map=new HashMap<RandomListNode, RandomListNode>();
          RandomListNode cur=pHead;
          while(cur!=null){
              map.put(cur, new RandomListNode(cur.label));
              cur=cur.next;
          }
          cur=pHead;
          while(cur!=null){
              map.get(cur).next=map.get(cur.next);
              map.get(cur).random=map.get(cur.random);
              cur=cur.next;
          }
            return map.get(pHead);
        }
}


//方法二
   遍历一次链表,将链表复制的副本节点放到自己后面,再从左到右遍历一次链表,设置random指针。分离链表,返回。
package com.chen.zaixian.array;

import java.util.HashMap;



 public RandomListNode Clone(RandomListNode pHead) {
   if(pHead==null){return null;}
   RandomListNode cur=pHead;
   RandomListNode next=null;
   while(cur!=null){
       next=cur.next;
       cur.next=new RandomListNode(cur.label);
       cur.next.next=next;
       cur=next;
   }
   cur=pHead;
   RandomListNode curCopy=null;
   while(cur!=null){
       next=cur.next.next;
       curCopy=cur.next;
       curCopy.random=cur.random!=null?cur.random.next:null;
       cur=next;
   }
   RandomListNode res=pHead.next;
   cur=pHead;
   while(cur!=null){
       next=cur.next.next;
       curCopy=cur.next;
       cur.next=next;
       curCopy.next=next!=null?next.next:null;
       cur=next;
   }
     return res;
 } 

    
  
版权声明:本文为博主原创文章,未经博主允许不得转载。

leetcode之有随机指针的链表深拷贝

题目: Copy List with Random Pointer A linked list is given such that each node contains an a...

复制带随机指针的链表

题目描述:给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。  首先,我先解释一下题目的意思。就是完全按照给出的链表的关系复制链表,比如,原链表...

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

本人电子系,只为一学生。心喜计算机,小编以怡情。给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。 解答思路:既然给了一个random指针,那么...

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

class Solution { public: /** * @param head: The head of linked list with a random pointer. ...

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

题目  复制带随机指针的链表 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。 返回一个深拷贝的链表。  ...
  • fly_yr
  • fly_yr
  • 2016年06月07日 21:44
  • 2201

随机指针链表深复制

题目描述[微软苏州]一条带随机指针的链表,对于每个节点,除了next指针指向下一个节点以外,还带一个randNext指针指向链表中任何一个节点或空。求对这个链表进行深复制,即复制出的链表和原来链表具有...

从单链表中输出指定值的节点

描述 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 链表结点定义如下: struct ListNode { int ...
  • sanqima
  • sanqima
  • 2015年09月20日 18:11
  • 779

通讯录实现代码 C++ 链表

#include#include#include#include#include#include #include using namespace std;unsigned int num=0;str...

如何复制一个含有随机指针节点的链表

如何复制一个含有随机指针节点的链表方法总结

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

复制带随机指针的链表描述 笔记 数据 评测 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。 您在真实的面试中是否遇到过这个题?...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:复杂链表的复制(复制含有随机指针节点的链表)
举报原因:
原因补充:

(最多只允许输入30个字)