LeetCode 面试题35. 复杂链表的复制
程序员文章站
2022-05-06 11:33:01
...
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
示例:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
算法:
例如
head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
遍历链表3次
第一次克隆链表的每一个节点,但不给random指针赋值,将这个节点插在当前节点的后面。执行完,链表变成:
head = [[7,null],[7,null],[13,0],[13,null],[11,4],[11,null],[10,2],[10,null],[1,0],[1,null]]
第二次遍历,给克隆节点的random指针赋值。
分为两种情况:
1、像节点7,它的random是null,那么克隆节点就不必赋值。
2、其他节点的random都不为空,那么克隆节点的random其实就是指向原节点random指针指向节点的下一个。
第三次遍历,将这个大链表分成两个。
时间复杂度O(N)
Java实现
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
class Solution {
public Node copyRandomList(Node head) {
Node cur=head;//指向原链表当前位置
while(cur!=null){//复制节点
Node temp=new Node(cur.val);
temp.next=cur.next;
cur.next=temp;
cur=cur.next.next;
}
cur=head;
while(cur!=null){//给random指针赋值
if(cur.random!=null)
cur.next.random=cur.random.next;
cur=cur.next.next;
}
Node res=new Node(-1);//存放结果
Node temp=res;
cur=head;
while(cur!=null){//切分两个链表
temp.next=cur.next;
temp=temp.next;
cur.next=temp.next;
cur=cur.next;
}
return res.next;
}
}
推荐阅读
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
leetcode 160剑指offer面试题52. 两个链表的第一个公共节点(python3)
-
复杂链表的复制
-
[PHP] 算法-复制复杂链表的PHP实现
-
LeetCode 138. 复制带随机指针的链表
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
LeetCode 面试题35. 复杂链表的复制
-
复杂链表的复制
-
复杂链表的复制(链表的每个结点,有一个next指针指向下一个结点,还有一个random指针指向这个链表中的一个随机结点或者NULL)
-
复杂链表的复制