剑指offer-25-复杂链表的复制

复杂链表的复制_牛客网

https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&tqId=11178&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

这道题目刚开始读起来没有思路,最后只能用比较笨拙的方法来实现,用map保留过曾经访问过的值。只是在写代码的过程中原始链表和新链表的指针弄反了,以至于到最后报空指针错误,哎,以后变量的命名还是要规范化一点比较好

//下面那段代码思维太混乱了,大家不要参考,如果要用map解决此题,看这段代码就好
import java.util.HashMap;
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();
        RandomListNode p = pHead;
        //第一次遍历 新建立节点
        while(p != null){
            RandomListNode newNode = new RandomListNode(p.label);
            map.put(p, newNode);
            p = p.next;
        }
        //第二次遍历 赋值映射关系
        p = pHead;
        while(p != null){
            RandomListNode node = map.get(p);
            node.next = (p.next == null)?null: map.get(p.next);
            node.random = (p.random == null)?null: map.get(p.random);
            p = p.next;
        }
        //最后的返回值
        return map.get(pHead);

    }
}

整体思路还是想的比较简单:用map保存旧节点和新节点之间的映射关系,如果节点已经存在那么使用存在的节点即可,如果不存在那么需要新开辟节点并存储他们之间的映射关系

import java.util.Map;
import java.util.HashMap;
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead == null)return null;
        RandomListNode newHead = null;
        RandomListNode p = pHead;
        RandomListNode q = null;
        Map<RandomListNode, RandomListNode> map = new HashMap<>();
        while(p != null){
            if(newHead == null){
                newHead = new RandomListNode(pHead.label);
                q = newHead;
                map.put

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

小白刷剑指offer 文章被收录于专栏

跟着小白一起刷剑指offer,通过讨论加深印象吧~ 没有人不学习就能够掌握知识,知识就是需要学习的~

全部评论
如果使用map,那么空间消耗是4条链表,时间消耗n;不使用map,空间消耗就是两条链表,时间消耗3n。用两倍空间换3倍时间,如果空间足够,感觉很划算.....
2 回复 分享
发布于 2019-11-21 20:35
请问大佬们,第一种方法为什么返回的是map.get(pHead)?这块没想明白。
点赞 回复 分享
发布于 2021-08-12 08:07
大佬能否告知为什么是new RandomListNode(p.label);里面的p.label是做什么的?
点赞 回复 分享
发布于 2021-04-11 22:45
最后一种方法有问题 复制下一个节点的时候 ,少了一句 current->next=cloneNode.希望后来的能看见!
点赞 回复 分享
发布于 2020-10-05 10:34
第一种思路,第二遍遍历判空的时候可以用map.getOrDefault()代替三目表达式,看着简便一些
点赞 回复 分享
发布于 2020-08-27 10:43
新手刚入坑,想问问楼主你这里为什么在对lable值操作的时候要用p.next,而random是 p ,因为在每循环完一次的时候已经进行了next操作了;是不是每次操作的时候对当前节点的random和当前节点的next的lable操作;这样的话头节点的下一个节点的lable是不是没复制上;
点赞 回复 分享
发布于 2020-06-24 16:59
单看逻辑,我有俩个疑惑。第一个:第一次循环初始化头节点以后,头节点的next和random指针没有处理;第二个:在第二次循环时直接讨论了当前节点(目前是除了头节点第一个节点)next和random指针并深拷贝了next和random指针指向的节点,但是当前节点label值未处理。感觉逻辑不是很严谨。
点赞 回复 分享
发布于 2020-06-03 14:56
第二种思路在next无法遍历到所有结点的情况下,是不是会报错啊?我也是提完代码,看失败案例的输入才想到的,但我看别的题解都没考虑过这种情况,但调试都过了!还是说我想多了,这种情况不会出现?
点赞 回复 分享
发布于 2020-04-30 22:42
while(p->next) 如果遇到死节点,既没有next,也没有 random,程序就结束了,其实复杂链表里面的next 和random 不能用while(next)这样简单的逻辑
点赞 回复 分享
发布于 2020-03-28 17:03
浮沉啊,你这个map我感觉放着起不到作用啊
点赞 回复 分享
发布于 2020-03-24 11:50
不太理解为什么这么做,一遍遍历老链表的同时创建新链表不行吗?就像这样的吧: public RandomListNode Clone(RandomListNode pHead) { if(pHead == null) return null; RandomListNode head = null; RandomListNode result = null; while(pHead != null){ if(head == null) head = new RandomListNode(pHead.label); else{ head.next = new RandomListNode(pHead.label); head = head.next; } if(result == null) result = head; if(pHead.random != null) head.random = new RandomListNode(pHead.random.label); pHead = pHead.next; } return result; }
点赞 回复 分享
发布于 2020-03-08 09:11
请问第三步的pCloneHead是怎么和后面循环中的cloneNode建立关系的呢?
点赞 回复 分享
发布于 2020-03-04 18:34
为什么要拆成3步,第二部为什么不能放到第一步啊,一放纠错,奇怪
点赞 回复 分享
发布于 2020-02-27 00:18
27行中为什么不是A1.random = A.random;而是A1.random = A.random.next呢
点赞 回复 分享
发布于 2020-02-19 21:23
第二个思路很厉害
点赞 回复 分享
发布于 2020-02-13 17:09
随机节点为什么要把他的next赋值给克隆节点的随机节点
点赞 回复 分享
发布于 2020-01-10 20:34
public class Solution { public RandomListNode Clone(RandomListNode head){ if(head==null) return null; Map<randomlistnode> map=new HashMap<>(); RandomListNode newHead=new RandomListNode(head.label); RandomListNode p=head; RandomListNode q=newHead; map.put(head,newHead); while(p!=null){ if(p.next!=null && map.containsKey(p.next)) q.next=map.get(p.next); else if(p.next!=null){ RandomListNode temp=new RandomListNode(p.next.label); q.next=temp; map.put(p.next,temp); } if(p.random!=null && map.containsKey(p.random)) q.random=map.get(p.random); else if(p.random!=null){ RandomListNode temp=new RandomListNode(p.random.label); q.random=temp; map.put(p.random,temp); } p=p.next; q=q.next; } return newHead; } }</randomlistnode>
点赞 回复 分享
发布于 2019-11-21 20:50

相关推荐

评论
76
5
分享

创作者周榜

更多
牛客网
牛客企业服务