138. 复制带随机指针的链表
链表结构如下图 (LeetCode题目给的图片)
难点在与随机指针的处理,同时注意处理好null节点
思路及算法:迭代 + 拆分
三步
初始队列
第一步:拷贝每一个节点。将新拷贝出来的节点插入原始节点后面(此时不处理随记指针)
第二部:根据原始节点随机指针的位置,定位拷贝节点随机指针的位置,拷贝节点的随机指针位置会在原始指针下一位(注意处理null)
第三部,拆分两个链表
将上面的图转化成代码:
class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
Node tempHead = head;
while (tempHead != null) {
Node newNode = new Node(tempHead.val);
newNode.next = tempHead.next;
tempHead.next = newNode;
tempHead = newNode.next;
}
tempHead = head;
while (tempHead != null) {
Node newNode = tempHead.next;
if (newNode != null) {
newNode.random = tempHead.random == null ? tempHead.random : tempHead.random.next;
}
tempHead = newNode.next;
}
tempHead = head;
Node resHead = head.next;
while (tempHead != null) {
Node newNode = tempHead.next;
tempHead.next = newNode.next;
if (newNode.next != null) {
newNode.next = tempHead.next.next;
}
tempHead = tempHead.next;
}
return resHead;
}
}