[Leetcode] Copy List with Random Pointer 复制随机指针

news/2024/6/2 17:05:44

Copy List with Random Pointer

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.

栈迭代

复杂度

时间 O(N) 空间 O(N) 如果不算新链表的空间则是O(1)

思路

由于随机指针有可能产生环路,我们不能直接沿着随机指针的方向一个一个复制。同时我们又不能沿着next指针直接复制,因为我们不知道随机指针所指向的新节点是哪个。这里有个技巧,我们把复制的表一对一的插在旧表的每个节点后面,这样在第二次遍历链表时,我们就肯定知道随机指针指向的新节点是哪个了,肯定是旧节点随即指针指向的旧节点的下一个节点。然后我们再遍历一遍,把新旧两个链表分割开来就行了。

代码

public class Solution {
    public RandomListNode copyRandomList(RandomListNode head) {
        if(head==null) return null;
        RandomListNode n1 = head;
        RandomListNode n2;
        // 生成新节点并接在旧节点后面
        while(n1!=null){
            n2 = new RandomListNode(n1.label);
            n2.next = n1.next;
            n1.next = n2;
            n1 = n1.next.next;
        }
        // 给新节点的random字段赋值
        n1 = head;
        n2 = n1.next;
        while(n1!=null){
            n2.random = n1.random != null ? n1.random.next : null;
            n1 = n1.next.next;
            n2 = n1 != null ? n2.next.next : null;
        }
        n1 = head;
        n2 = n1.next;
        RandomListNode res = n2;
        // 将新旧节点分开
        while(n1!=null){
            n1.next = n1.next.next;
            n2.next = n2.next != null ? n2.next.next : null;
            n1 = n1.next;
            n2 = n2.next;
        }
        return res;
    }
}

http://www.niftyadmin.cn/n/4030666.html

相关文章

只考虑自己会严重损害智商——北漂18年(32)

上回说到,失业之后的三种选择,本次讲下找新工作的事儿。先说个题外话2015年8月,我跟个创业者D先生聊自己之后的打算。谈及之前的经历和我之后可以有的几项选择,问D先生的意见。我一般不问别人的意见,一来路要自己走&am…

vue v-bind v-on

v- 前缀作为一种视觉提示,用来识别模板中 Vue 特定的特性。当你在使用 Vue.js 为现有标签添加动态行为 (dynamic behavior) 时,v- 前缀很有帮助,然而,对于一些频繁用到的指令来说,就会感到使用繁琐。同时,在…

霍尼韦尔Granit 1990iSR工业二维码扫描枪

霍尼韦尔Granit 1990iSR工业二维码扫描枪可很快准确地读取条形码符号,从而比较大程度地提高操作效率。其好的的耐用性降低了总体拥有成本。为好的的扫描性能也可以很快完成受损和低质量条形码的扫描。新一代的Granit™ XP扫描器进一步扩展了功能并重新定义了超坚固性…

找到新工作,心里还是空荡荡滴——北漂18年(33)

上次说到2002年同事帮忙介绍了面试的机会,我按通知到亚运村某居民楼。 去应聘的公司是做系统集成的,跟我在国企算是一个领域。公司两个女老板,一个负责市场,一下负责技术,她们之前在同一家公司打工,后来公司…

文件查找命令find的使用方法

文件查找:在文件系统上查找符合条件的文件的过程;文件查找:locate, findlocate: 非实时查找工具;依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新此数据库(updatedb)&…

手持终端健康码设备,查看健康码及核酸信息

手持终端健康码设备,查看健康码及核酸信息。如何安全高效地应对“健康码”查验工作,一直以来都是各防疫部门和疫情防控指挥部重点关注且须着力解决的重要课题之一。此前,积引入健康码人脸识别测温门禁机方案,核验通行效率确实有较…

谈谈学习方法论

刘未鹏在他的《暗时间》中提到: 学习一项知识,必须问自己三个重要问题:1. 它的本质是什么。2. 它的第一原则是什么。3. 它的知识结构是怎样的。 但是后来我在实践中发现,如果刚接触一样新事物,一上来就给自己抛出这三个…

离开国企继续前(chu)进(chou )——北漂18年(34)

本次与大家分享一下,我靠能力是怎么前(chu)进(chou )的。 2002年,进入ZB时谈到有3个月的试用期,薪水按我要求的6K/月(是以前1.5K的四倍)。别高兴的太早,平时发…