一、概述
lettcode面试题35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
二、代码
思路:
1)构建新链表的结点,random为null,用原来链表节点的next指向对应的新结点,新结点的next指向原链表的下一个结点。
2)给新节点的random赋值。
3)恢复原链表和新链表的链表结构。
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
Node cur = head;
Node tmp = head;
while (cur != null) {
tmp = new Node(cur.val);
tmp.next = cur.next;
cur.next = tmp;
cur = cur.next.next;
}
cur = head;
while (cur != null) {
if (cur.random != null) {
cur.next.random = cur.random.next;
}
cur = cur.next.next;
}
cur = head;
Node res = head.next;
while (cur != null && cur.next != null) {
tmp = cur.next;
cur.next = tmp.next;
cur = tmp;
}
return res;
}