剑指 Offer 35. 复杂链表的复制(Java题解)
题目描述
题目链接:https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/
分析题目
这是一个复制复杂链表的问题,这个链表除了含有指向下一结点的next域之外,还含有一个random域,表示随机指向的结点位置。
以下是图解:
第一张图是待复制的链表,剩下三张图使用三个循环来进行。
- 第一次循环:创建一个newNode,使node的next指向newNode,newNode的next指向node.next。
- 第二次循环:处理random域
- 第三次循环:完成最后的复制
题解
由图解,可以写出题解,AC代码如下:
class Solution {
public Node copyRandomList(Node head) {
if (head==null){
return null;
}
for (Node node=head; node!=null; node=node.next.next){
Node newNode = new Node(node.val);
newNode.next = node.next;
node.next = newNode;
}
for (Node node=head; node!=null; node=node.next.next){
Node newNode = node.next;
newNode.random = (node.random != null) ? node.random.next : null;
}
Node newHead = head.next;
for (Node node=head; node!=null; node=node.next){
Node newNode = node.next;
node.next = node.next.next;
newNode.next = (newNode.next != null) ? newNode.next.next : null;
}
return newHead;
}
}