题目描述:
给你一个长度为 n
的链表,每个节点包含一个额外增加的随机指针 random
,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n
个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next
指针和 random
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
例如,如果原链表中有 X
和 Y
两个节点,其中 X.random --> Y
。那么在复制链表中对应的两个节点 x
和 y
,同样有 x.random --> y
。
返回复制链表的头节点。
用一个由 n
个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index]
表示:
val
:一个表示Node.val
的整数。random_index
:随机指针指向的节点索引(范围从0
到n-1
);如果不指向任何节点,则为null
。
你的代码 只 接受原链表的头节点 head
作为传入参数。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]示例 2:
输入:head = [[1,1],[2,1]] 输出:[[1,1],[2,1]]示例 3:
输入:head = [[3,null],[3,0],[3,null]] 输出:[[3,null],[3,0],[3,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;
}
Node h = new Node(head.val);
Node p1 = head.next,p2=h;
while(p1!=null){
Node nod = new Node(p1.val);
// nod.val=p1.val;
p2.next=nod;
p2=p2.next;
p1=p1.next;
}
//
Node temp = head;
Node temp2 = h;
while(temp!=null){
p1=head;
p2=h;
if(temp.random==null){
temp2.random = null;
temp=temp.next;
temp2=temp2.next;
}else{
while(temp.random!=p1){
p1=p1.next;
p2=p2.next;
}
temp2.random = p2;
temp=temp.next;
temp2=temp2.next;
}
}
return h;
}
}
查漏补缺:
原始的这段代码出错:
出现了以下错误
java.lang.NullPointerException: Cannot read field "random" because "<local5>" is null
at line 35, Solution.copyRandomList
at line 191, __DriverSolution__.__helper__
at line 227, __Driver__.main
while(temp.random!=null&&temp.random!=p1){
p1=p1.next;
p2=p2.next;
}
原因分析:
NullPointerException
出现在访问 temp.random
时。这表明 temp
在某些情况下是 null
,或者 temp.random
在访问时是 null
。
在这段代码中,如果 temp.random
为 null
,则 temp.random != p1
条件判断会导致空指针异常。因此需要在判断 temp.random != null
后再执行其他操作。这样可以防止尝试访问 null
时出现异常。
解决方法:
-
修复随机指针的处理逻辑: 在判断
temp.random != null
时,应该确保在访问temp.random
之前进行空值判断。