2015-03-29 1 views
2

как заголовок говорит, я хочу сравнить 2 связанных списка (Готово и работа), и я хочу удалить узлы с одинаковыми значениями ТОЛЬКО В СПИСОКЕ 2 .. Я написал код и попробовал его он работает в конкретных случаях, но я не могу понять, что с ним происходит (давая неправильные результаты). идея, которую я использовал, - это привязать LinkedList к узлу, сравнивая его со всеми узлами в другом списке, а затем удалять, когда он находит, что они равны.Удаление узла с одинаковыми данными в 2 LinkedLists

Вот удаления кода головы:

public void deleteHead() { 
    if (head != null) { 
     head = head.getNext(); 
    } 
} 

и вот CompareTo Код:

public int compareTo(NodeData nd) { 
    if (num == nd.getNum()) { 
     return 0; 
    } 
    if (num != nd.getNum()) { 
     return -1; 
    } 
    return 1; 
} 

И это метод удаления

public void delete(LinkedList LL) { 
    Node curr = head; 
    Node curr2 = LL.head; 
    while (curr2 != null) { //To traverse LL when list1 is done traversing 
     while (curr != null) { //traverse list1 while checking for common Nodes to delete 

      if (curr2.getData().compareTo(curr.getData()) == 0) { //compare data in the Nodes 
       System.out.println(curr2.getData().getNum() + " FOUND, WILL BE DELETED"); 
       deleteHead(); //delete the current node of list1 
       curr = curr.getNext(); 
       break; 
      } 
      else if (curr2.getData().compareTo(curr.getData()) == -1){ 
       System.out.println(curr2.getData().getNum() + " Doesn't Match");} 
      curr = curr.getNext(); //next node in list1 
     } 
     curr2 = curr2.getNext(); //next node in LL 
    } 
} 

я попытался с простой выход:

Output

+0

это здорово иметь код, но вы можете дать пример того, что происходит не так, кроме ссылки? –

+0

Я только что отредактировал инструкцию if, чтобы проверить и ответить снова. –

+0

он дважды проверяет один и тот же узел, удаляя голову (просто знал, что мне нужно сделать другой метод для текущего узла), а комментарий ниже также является проблемой (итерацией) @MartinSerrano –

ответ

0

Если данные двух узлов равны тому, что вы удаляете голову одного из списков вместо текущего узла.

Во-вторых, вы должны сравнить каждый элемент первого с каждым элементом второго списка, внутренний цикл будет повторяться и потреблять второй список, а когда он снова будет вызван - не будет итерации, поэтому вы вероятно, следует изменить:

while (curr2 != null) { //To traverse LL when list1 is done traversing 
     while (curr != null) { //traverse list1 while checking for common Nodes to delete 

к:

while (curr2 != null) { 
    Node curr = head; // <-- pay attention here, every loop you need to start from the beginning! 
    while (curr != null) { 
     if ... { 
      delete(curr); // TODO: need to implement this method in your LinkedList class 
     else { 
      ... 
+0

, поэтому я должен сделать новый метод для удаления текущий узел и протестировать код с вашим новым образцом .. но что такое итератор? Я попробую прямо сейчас. @alfasin –

+0

Я не могу понять, что вы написали, я думал, что мой код уже пересекает каждый элемент списка1 со всеми элементами списка2? @alfasin –

+0

@AliKaraki тот факт, что вы назвали свой класс 'LinkedList', смутил меня (потому что [есть такой класс] (http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList .html) в Java). Я скорректировал ответ соответственно. – alfasin

Смежные вопросы