138. Copy List with Random Pointer
题目
给定一个链表,每个结点包含一个额外的随机指针,可以指向列表中的任意结点或者指向null。
深拷贝这个链表。
代码块
/**
* Definition for singly-linked list with a random pointer.
* class RandomListNode {
* int label;
* RandomListNode next, random;
* RandomListNode(int x) { this.label = x; }
* };
*/
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head == null) return null;
RandomListNode fastNode = head;
while(fastNode != null){
RandomListNode insert = new RandomListNode(fastNode.label);
insert.next = fastNode.next;
fastNode.next = insert;
fastNode = fastNode.next.next;//无需再添加判别
}
fastNode = head;
while(fastNode != null){
if(fastNode.random != null){
fastNode.next.random = fastNode.random.next;
}
fastNode = fastNode.next.next;
}
fastNode = head;
RandomListNode newHead = head.next;
while(fastNode != null){
RandomListNode newNode = fastNode.next;
fastNode.next = newNode.next;
if(newNode.next != null){//注意是next
newNode.next = newNode.next.next;
}
fastNode = fastNode.next;
}
return newHead;
}
}
代码分析
这道题第一次看到跳过去了,完全没有思路。经过张同学的讲解,才理清了思路。
第一步:复制链表结点;
第二步:复制随机Random指针;
第三步:进行拆分。
注意二三步的判别条件。