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

原创 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;
 } 

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

复制含有随机指针节点的链表——C++实现

【题目】:        一种特殊的链表节点类描述如下: struct RandomListNode { int label; struct RandomListNode *next, *ra...
  • chen134225
  • chen134225
  • 2017年10月09日 09:57
  • 92

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

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

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

题目: Copy List with Random Pointer A linked list is given such that each node contains an a...
  • xunileida
  • xunileida
  • 2014年12月13日 11:51
  • 2173

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

class Solution { public: /** * @param head: The head of linked list with a random pointer. ...
  • u011464853
  • u011464853
  • 2015年11月22日 02:25
  • 660

LintCode:复制带随机指针的链表

LintCode:复制带随机指针的链表尝试先顺序拷贝原来的链表,不加随机指针,然后再遍历一次,加上随机指针,超时。。。# Definition for singly-linked list with ...
  • u012225151
  • u012225151
  • 2016年08月13日 00:36
  • 304

LintCode复制带随机指针的链表

中等 复制带随机指针的链表 查看运行结果  27% 通过 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。 返回一...
  • susser43
  • susser43
  • 2015年07月09日 12:52
  • 999

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

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

复杂链表的复制 java

剑指offer题目 用java实现,ac通过 Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数Com...
  • samjustin1
  • samjustin1
  • 2016年07月15日 20:41
  • 1300

剑指offer--面试题26:复杂链表的复制--Java实现

题目描述:复制一个复杂链表,在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sbiling指向链表中的任意结点或者null。下图是一个复杂链表的示例,Null的指针没有画出。 ...
  • u012289407
  • u012289407
  • 2015年06月23日 20:14
  • 1875

复杂链表的复制(C++)

题目:         输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点(可以为NULL) )。 要求实现一个算法返回一个链表,结构与输入的链...
  • u013575812
  • u013575812
  • 2015年12月04日 21:15
  • 730
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:复杂链表的复制(复制含有随机指针节点的链表)
举报原因:
原因补充:

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