удаление дубликатов в связанном списке - PullRequest
0 голосов
/ 18 апреля 2020

Я опробовал следующий код в 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 и возвращает головку сгенерированный связанный список

Ответы [ 4 ]

0 голосов
/ 18 апреля 2020

Это обновление слишком поздно, но у него нет 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;
}
0 голосов
/ 18 апреля 2020

Если я только что прочитал ваш заголовок, вы можете удалить дубликаты из LinkedList путем итерации, сохранить значение в Set и проверить наличие дубликатов через Set, если он содержит возврат true, вызовите удаление в интеграторе.

Iterator iter = list.iterator();
Set set = new HashSet();
while (iter.hasNext())
 {

  Object obj = iter.next();
  if(set.contains(obj))){
        iter.remove();
  }else{
        set.add(obj);
      }
  }

0 голосов
/ 18 апреля 2020

удалить дубликаты

list.stream().distinct().peek(System.out::println).collect(Collectors.toList());
0 голосов
/ 18 апреля 2020

Должно быть 2 While l oop, чтобы выбрать один элемент и проверить, существует ли element в Linked List. Следующий код может помочь вам лучше понять.

LinkedListNode<Integer> ptr1=head;
        LinkedListNode<Integer> ptr2=head.next;
        if(head==null)
            return null;
        if(head.next==null)
            return head;

        while (ptr1 != NULL && ptr1.next != NULL) // pick 1 element at time
        { 
            ptr2 = ptr1; 
            while (ptr2.next != NULL) 
            { 
                if (ptr1.data == ptr2.next.data) // check if the element exits in LinkedList or not
                { 
                    dup = ptr2.next; 
                    ptr2.next = ptr2.next.next; 

                } 
                else 
                    ptr2 = ptr2.next; 
            } 
            ptr1 = ptr1.next; 
        } 
        return head;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...