【链表问题】打卡8:复制含有随机指针节点的链表
前言
以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获。每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢。
注:如果代码排版出现了问题麻烦通知我下,谢谢。
【题目描述】
【要求】
如果链表的长度为 N, 时间复杂度达到 O(N)。
【难度】
尉:★★☆☆
【解答】
方法一:使用额外的存储空间
这道题的难点在于我们需要定位好随机指针,一个比较简单的解法就是把原节点与复制的节点关联起来,可以使用哈希表把他们关联起来。
首先把副节点全部创建出来,然后把原节点与对应的副节点用哈希表关联起来。关联的时候原节点作为key,副节点作为value。例如对于链表 1->2->3->null。创建副节点 1', 2', 3'。然后用哈希表关联起来:
key | value |
---|---|
1 | 1' |
2 | 2' |
3 | 3' |
之后在把所有副节点连接成一个链表。在连接的时候,我们 可以通过哈希表很容易这找到对应的随机节点。
代码如下
//方法1:采用哈希表
public static Node1 copyListWithRand(Node1 head) {
Map<Node1, Node1> map = new HashMap<>();
Node1 cur = head;
while (cur != null) {
map.put(cur, new Node1(cur.value));
cur = cur.next;
}
//把副节点连接起来
cur = head;
while (cur != null) {
map.get(cur).next = map.get(cur.next);
map.get(cur).rand = map.get(cur.rand);
cur = cur.next;
}
return map.get(head);
}
这种方法的时间复杂度为 O(n), 空间复杂度也为 O(n)。
方法2
其实我们也可以不需要哈希表来辅助,也就是说 ,我们是可以做到空间复杂度为 O(1)的,我们可以把复制的副节点插入到原链表中去,这样也能把原节点与副节点进行关联,进而
定位到随机节点。例如,对于链表 1->2->3->null。首先生成副节点 1', 2', 3。然后把副节点插入到原节点的相邻位置,即把原链表变成 1->1'->2->2'->3->3'->null。
这样我们也可以在连接副节点的时候,找到相应的随机节点。例如 1 的随机节点是 3,则 1' 的随机节点是 3'。显然,1节点的随机节点的下一个节点就是 1'的随机节点。具体代码如下:
//方法二
public static Node1 copyListWithRand2(Node1 head){
Node1 cur = head;
Node1 next = null;
//把复制的节点插进去
while (cur != null) {
next = cur.next;
Node1 temp = new Node1(cur.value);//复制节点
temp.next = cur.next;
cur.next = temp;
cur = next;
}
//在一边把复制的节点取出来一边连接。
cur = head;
next = null;
while (cur != null) {
next = cur.next.next;//保存原链表的下一个节点
cur.next.next = next != null ? next.next : null;
cur.next.rand = cur.rand != null ? cur.rand.next : null;
cur = next;
}
return head.next;
}
采用这种方法的时候,由于随机节点有可能是空指针,随意写代码的时候要注意。
问题拓展
思考:如果是有两个随机指针呢?又该如何处理呢?三个呢?
【题目描述】
无
【要求】
无
【难度】
未知。
【解答】
提醒:别想太多了,保持清醒。
往期
【链表问题】打卡7:将单向链表按某值划分成左边小,中间相等,右边大的形式
最后推广下我的公众号:苦逼的码农,文章都会首发于我的公众号,期待各路英雄的关注交流。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?