我在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;
}

10-08 18:38