我在Java中尝试了以下代码以从链接列表中删除重复项
public static LinkedListNode<Integer> removeDuplicates(LinkedListNode<Integer> head) {
LinkedListNode<Integer> ptr1=head;
LinkedListNode<Integer> ptr2=head.next;
if(head==null)
return null;
if(head.next==null)
return head;
while(ptr2!=null){
if(ptr1.data==ptr2.data){
ptr2=ptr2.next;
}else{
ptr1.next=ptr2;
ptr1=ptr2;
ptr2=ptr2.next;
}
}
ptr1.next=ptr2;
return head;
}
它以链接列表的开头作为输入,然后从中删除重复项后返回开头。
如果我们将以下示例输入用于链接列表
281 386 386 957 1022 1216 1232 1364 1428 1428 1428 1428 1501 1953
它没有按预期删除重复项
我尝试在vscode中对其进行调试,并惊讶地发现,在输入的前386个之后,如果ptr1位于386且ptr2位于386,则
ptr1.data == ptr2.data
的计算结果为false
我也尝试了LinkedListNode的吸气剂
ptr1.getData()==ptr2.getData()
出现错误是否有一些与内存分配有关的概念,我没有涉及堆或其他东西?
如果您对
LinkedListNode
类感到好奇以及用于创建链表的函数,它们是:
public class LinkedListNode<T> {
T data;
LinkedListNode<T> next;
LinkedListNode (T data){
this.data=data;
}
T getData(){
return this.data;
}
}
和
static LinkedListNode<Integer> takeinput(){
Scanner sc = new Scanner(System.in);
int data = sc.nextInt();
LinkedListNode<Integer> head = new LinkedListNode<Integer>(data);
LinkedListNode<Integer> tail = head;
data=sc.nextInt();
while(data!=-1){
LinkedListNode<Integer> newNode = new LinkedListNode<Integer>(data);
if(head.next==null){
head.next=newNode;
tail=newNode;
}else{
tail.next=newNode;
tail= newNode;
}
data=sc.nextInt();
}
sc.close();
return head;
}
输入:281 386 386 957 1022 1216 1232 1364 1428 1428 1428 1428 1501 1953 -1
输入-1后停止输入,并返回生成的链表的开头
最佳答案
此更新为时已晚,但没有NPE:
public static LinkedListNode<Integer> removeDuplicates(LinkedListNode<Integer> head) {
if (head == null || head.next == null)
return head;
LinkedListNode<Integer> ptr1 = head;
LinkedListNode<Integer> ptr2 = head.next;
while (ptr2 != null) {
while(ptr1.data.equals(ptr2.data)) {
ptr2 = ptr2.next;
ptr1.next = ptr2;
}
ptr1.next = ptr2;
ptr1 = ptr2;
ptr2 = ptr2.next;
}
ptr1.next = ptr2;
return head;
}