Noneyabees Ответов: 2

Как проверить наличие дубликатов в связанном списке?


I am trying to check for duplicates in a private method I created. I don't think I am implementing it correctly. I was hoping to get some help. Below are the methods I need to check for duplicates and also the private Boolean method that checks for duplicates.
public LinkedList2<T> union( LinkedList2<T> other )
   {
       LinkedList2 unionSet = new LinkedList2() ;
       LinkedList2 unionSet2 = other;
       Node curr;
       for(curr = head; curr != null; curr = curr.getNext())
       {
           unionSet.insertAtTail(curr.getData());
  
       }
       for(curr = unionSet2.head; curr != null; curr = curr.getNext())
       {
           if(!unionSet.contains(curr.getData())&& checkingForDupes(unionSet)== false)
           {
               unionSet.insertInOrder(curr.getData());
          
           }
       }
       return unionSet;
      
   }
   public LinkedList2<T> inter( LinkedList2<T> other )
   {
       LinkedList2 interSet = new LinkedList2<T> () ;
       Node<T> interSet2 = this.head;
       Node<T> interSet3 = other.head;
      
       while(interSet2.getNext()!=null)
       {
           interSet3 = other.head;
           while(interSet3 != null)
           {
               if(interSet2.getData().equals(interSet3.getData()) && checkingForDupes(interSet)== false)
               {
                   interSet.insertInOrder(interSet3.getData());
               }
               interSet3 = interSet3.getNext();
           }
           interSet2 = interSet2.getNext();
       }
       return interSet;
      
   }
   public LinkedList2<T> diff( LinkedList2<T> other )
   {
       LinkedList2 diffList = new LinkedList2 ();
       Node<T> diff2 = this.head;
       Node<T> diff3 = other.head;
       while(diff2 != null)
       {
           diff3 = other.head;
           while(diff3 != null)
           {
               if(diff2.getData().equals(diff3.getData()) && checkingForDupes(diffList)== false)
               {
                   diff2 = diff2.getNext();
               }
               diff3 = diff3.getNext();
           }
           diffList.insertInOrder(diff2.getData());
           diff2 = diff2.getNext();
       }
       return diffList;
   }
   private boolean checkingForDupes(LinkedList2<T> other)
   {
       int currentIndex = 0;
       for (Node<T> curr = other.head; curr != null; curr = curr.getNext())
       {
           int nodeIndex = 0;
           for (Node<T>thing = other.head; thing!= null; thing = thing.getNext())
           {
               if (currentIndex != nodeIndex && thing.equals(curr))
               {
                   return true;
               }
               nodeIndex++;
           }
           currentIndex++;
       }
       return false;
   }


Что я уже пробовал:

Попробовал изменить логический метод, но безуспешно.

2 Ответов

Рейтинг:
19

OriginalGriff

Вместо того чтобы делать это с вложенными циклами внутри вложенных циклов, создайте новую временную коллекцию в виде копии исходных ссылок на узлы и отсортируйте ее по вашему компаратору различий. Это может быть массив, чтобы сделать его проще и более производительным в памяти.

Дубликаты затем находятся по соседству друг с другом и их очень легко обнаружить ...

Но, как правило, "пытался изменить Булев метод, но безуспешно" - это не очень хороший способ найти проблемы. Вместо этого научитесь использовать отладчик в своей системе и точно определять, что происходит во время выполнения кода. Отладчик позволит вам работать построчно и просматривать / изменять значения переменных, пока он это делает. Это означает, что вы получаете "реальную информацию" о том, что ваш код на самом деле делает, и можете определить, где возникают проблемы, а не просто угадывать и вносить случайные изменения.


Maciej Los

Очень хороший совет!

Рейтинг:
0

CPallini

На этой странице вы можете найти два жизнеспособных подхода: Как объединить два ArrayLists в Java - HowToDoInJava[^] (ArrayLists обеспокоены, но я думаю, что вы можете легко адаптироваться).
Первый из них может добавить новый интересный вид занятий в ваш репертуар.