想了半个小时不知道怎么下手就看了一下题解。题解中的迭代+节点拆分的方法很容易理解,
就是在原链表的每个节点后面创建一个新节点,这个新节点的val就是原节点的val,新节点的下一个节点就是原节点的下一个节点。
新节点的随机节点就是原节点的随机节点的下一个节点
然后再把链表拆开返回新链表头节点
整个过程中注意null值的影响。
/*
// 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) {
if(head == null){
return null;
}
for(Node node = head; node != null; node = node.next.next){
Node nodeNew = new Node(node.val);
nodeNew.next = node.next;
node.next = nodeNew;
}
for(Node node = head; node != null; node = node.next.next){
Node nodeNew = node.next;
nodeNew.random = node.random != null ? node.random.next : null;
}
Node newHead = head.next;
for(Node node = head; node != null; node=node.next){
Node nodeNew = node.next;
node.next = nodeNew.next;
nodeNew.next = node.next != null ? node.next.next : null;
}
return newHead;
}
}