题目
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
思路
迭代,复制数组,原地修改
- 遍历链表,复制每个节点并将复制的节点到该节点后面。
- 再次遍历链表,每次遍历两个节点。设cur为当前原链表节点,p为复制节点,将原链表节点的random属性值赋给复制的p节点,p.random = cur.random.next; 注意:复制节点的random属性指向的节点也要是复制的节点
- 第三次遍历链表,将原链表复原,将复制的链表拼串。
class Solution {
public Node copyRandomList(Node head) {
if(head == null) { //头结点为空,返回null
return null;
}
Node cur = head;
while(cur != null) { //复制节点
Node copy = new Node(cur.val); //复制节点和节点的值
copy.next = cur.next;
cur.next = copy;
cur = cur.next.next;
}
cur = head;
while(cur != null) { //复制random
Node p = cur.next;
if(cur.random != null) {
p.random = cur.random.next;
}
cur = cur.next.next;
}
cur = head;
Node copyList = head.next; //copyList指向复制链表的头结点
while(cur != null) {
Node p = cur.next; //p指向cur的复制节点
cur.next = p.next;
if(p.next != null) {
cur = p.next;
p.next = cur.next;
} else {
cur = p.next;
}
}
return copyList;
}
}