复制一个带random指针的链表

一个单链表,其中除了next指针外,还有一个random指针,指向链表中的任意某个元素。如何复制这样一个链表呢?

通过next来复制一条链是很容易的,问题的难点在于如何恰当地设置新链表中的random指针。
很容易想到使用Hash表的做法,先依次遍历原链表,每经过一个节点X,开辟一个新节点Y,然后(key=X的地址,value=Y的地址)存入哈希表。第二次再遍历原链表,根据拓扑结构设置新的链表。需要O(n)的空间,时间也是O(n)。

如果不使用额外的空间,那么要想在旧链表和新链表的对应节点之间建立联系。就要利用链表中多余的指针。
O(n)复杂度,O(1)空间。如图所示,扫描两边即可。

需要复制的链表:

如图所示,ABCD是原来的链表,A’B’C’D’是复制的链表,第一遍扫描顺序复制next指针,把ABCD的next分别指向A’B’C’D’,将A’的next指针指向B,B’的next指针指向C,依次类推:

复制random指针: A’->random=A->random->next

恢复:A->next=A’->next;A’->next=A’->next->next;

参考:

http://wangliangfei4585.blog.163.com/blog/static/44819858201010601840371/

http://www.cppblog.com/yuech/archive/2011/04/02/143318.html

posted @   阿牧遥  阅读(1264)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示