题目比较简单,重点是理解思想,random不管,copy一定要放在next
而且里面的遍历过程不能省略
解法都在代码里,不懂就留言或者私信
/*
// 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 {
/**基本思路:1.遍历链表,每个节点拷贝一个节点放到它的next位置,然后它的copy的下一个放它原来的next
2.把copy的random指针指向原始节点random指针的下一个(因为下一个是random的copy)
3.拆分链表,把新的链表拷贝出来*/
public Node copyRandomList(Node head) {
if(head == null) {
return null;
}
/**遍历链表复制节点并连接 */
Node cur = head;
while(cur != null) {
Node next = cur.next;
Node curCopy = new Node(cur.val);
cur.next = curCopy;
curCopy.next = next;
cur = next;
}
/**设置新节点的random指针*/
cur = head;
while(cur != null) {
/**这里因为存在复制节点并且复制节点肯定放在原始节点的下一个,所以
cur.next肯定不为空,所以这里不会有空指针的问题*/
Node next = cur.next.next;
cur.next.random = cur.random == null? null : cur.random.next;
cur = next;
}
/**断开链接,分离出拷贝链表,这里先把拷贝链表头节点拿出来*/
Node newHead = head.next;
/**还是通过从原来的头开始遍历,因为原链表要改next指针 */
cur = head;
while(cur != null) {
/**拿到原来链表中的next,这个next可能为空 */
Node next = cur.next.next;
/**这里有可能next是null,要判断,不然会有空指针 */
cur.next.next = next == null? null : next.next;
/**指向原来的next */
cur.next = next;
/**指针挪到下个节点继续 */
cur = next;
}
return newHead;
}
}