Я опробовал следующий код в 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 и был поражен, увидев, что ptr1.data == ptr2.data
оценивается как false
, когда ptr1 находится на 386, а ptr2 на 386 после первых 386 входных данных. Я также пытался получить геттер для LinkedListNode, даже когда ptr1.getData()==ptr2.getData()
выдавал false
есть некоторые концепция, связанная с распределением памяти Я не собираюсь включать кучи или что-то еще?
, если вам интересно узнать о классе 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 и возвращает головку сгенерированный связанный список