【刷算法】复杂链表的复制

简介: 【刷算法】复杂链表的复制

题目描述


输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。


分析


常规的复制链表只需要考虑每个节点的next指针即可,但是该题还有另外一个random指针,且没有规律,可能指向任何其他节点,此时需要解决的问题是如何复制random指针。开始想先通过next指针构建新的链表,同时使用栈保存各个新节点,然后再通过栈来构建random指针,但是发现过程中并没有这么简单,比如对于A.random=C来说,那么在新链表中就是A1.random=C1,我无法在新链表中以O(1)的时间复杂度访问C1,所以我这种方法受阻。

在网上查到一种思路,遍历链表的时候把每个新节点添加在旧节点的后面,比如 A->B->C,复制完是A->A1->B->B1->C->C1,然后对于每个复制节点来说来说,A1.random=A.random.next,B1.random=B.random.next,C1.random=C.random.next,完美的解决了复制random指针时获取到目标节点的问题。最后再拆成两条链表即可。


代码实现


/*function RandomListNode(x){
    this.label = x;
    this.next = null;
    this.random = null;
}*/
function Clone(h)
{
    if(h === null)
        return h;
    var cur = h;
    // 第一次遍历,先复制所有节点,且把复制节点添加到相应节点后面
    while(cur !== null) {
        var node = new RandomListNode(cur.label);
        node.next = cur.next;
        cur.next = node;
        cur = node.next;
    }
    cur = h;
    // 第二次遍历,复制random指针
    while(cur !== null) {
        if(cur.random !== null){
            cur.next.random = cur.random.next;
        }
        cur = cur.next.next;
    }
    var clonedH = h.next;
    var temp;
    cur = h;
    // 第三次遍历,把链表拆开
    while(cur.next !== null) {
        temp = cur.next;
        cur.next = cur.next.next;
        cur = temp;
    }   
    return clonedH;
}



相关文章
|
12月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
182 1
|
6月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
103 0
|
12月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
122 0
|
12月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
129 0
|
12月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
125 0
|
12月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
266 0
|
8月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
200 30
|
8月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
313 25
|
11月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
11月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法

热门文章

最新文章