2013-05-07 1 views
-1

Я не могу заставить мою программу удалять последний узел или только узел в моем связанном списке. Он удалит любой другой узел. Эта программа позволяет пользователю вводить целые числа и удалять их. Заранее спасибо за вашу помощь.Удалить последний узел или только узел из связанного списка на Java.

// This method finds the value requested in the Linked List. 

public Node find(Node head, Comparable value2){ 
    if (head == null) 
     { 
      System.out.println("The list is empty"); 
      return null; 
     } 

    Node pointer = head; 
     while (pointer != null) 
     { 
      if (pointer.data.compareTo(value2)>=0) 
       { 
        Node delNode = pointer; 
        System.out.print("Found it. Deleting " + delNode.data + "\n"); 
        return delNode; 

       } 
      pointer = pointer.next; 
     } 

     return null;  
} 



// This method deletes a given value from the linked list. 

public void delete(Node head, Comparable value2){ 
    Node delNode; 
    delNode = find(head, value2); 
    if (delNode== null) 
    { 
     System.out.println("The value: " + value2 + " does not exist"); 
     print(head); 

    } 

    else 
     { 
     if (delNode.next == null) 
     { 
      System.out.println("Trying to delete last"); 
      delNode = null; 
      print(head); 
     } 
     else{ 
      delNode.data = delNode.next.data; 
      Node temp = delNode.next.next; 
      delNode.next = null; 
      delNode.next = temp; 
      print(head); 
     }   
     }  
    return; 
} 

Я думал, что если (delNode.next == null) {delNode = null} сделал бы это?

+1

Я боюсь, вы испытываете некоторый проход по ссылке/передачи по стоимости вопросов здесь. Какое поведение вы ожидали от того, что не видите, или какое неожиданное поведение вы сталкиваетесь? Как вы ожидали, что «удалите» работу в этом случае? – Gian

+0

'delNode' - локальная переменная. Вы можете назначить ему то, что хотите, это не повлияет на состояние объекта. Возможно, вы захотите обновить некоторые поля. – Thilo

+0

это единый список? – sanbhat

ответ

1

Если вы хотите удалить узел, вы должны иметь ссылку на узел перед тем тот, который вы хотите удалить, скажем beforeNode и установить

beforeNode.next = beforeNode.next.next; 

(Подумайте о специальных случаях, как вычеркивания последний элемент.)

См Java Linked List search and delete method

Пожалуйста, обратите внимание, что в последовательности

  delNode.next = null; 
     delNode.next = temp; 

Первая строка бесполезна.

+0

В случае только одного узла слева find вернет правильный, и я не могу установить a раньше. if (delNode.next == null) { System.out.println («Попытка удалить последний»); delNode = null; печать (головка); } // delNode = null должен установить только оставшийся узел в null? – Neophyte

+0

Как вы, вероятно, модифицировали метод 'find' для' findTheNodeBefore' семантики, этот метод выполняет специальную задачу, которую вы, вероятно, больше не использовали. Я бы предложил объединить два метода ('find'aka' findTheNodeBefore' и 'delete') в один. Я полагаю, что новый метод не будет длиннее одного из ваших - это из-за того, что в настоящее время выполняется несколько проверок «null» дважды. – fjf2002

1

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

Причина следующее не работает

 if (delNode.next == null) 
    { 
     System.out.println("Trying to delete last"); 
     delNode = null; 
     print(head); 
    } 

что delNode просто локальная переменная, установка delNode в нуль ничего за пределами удаления не влияет().

Если вы хотите удалить последний узел из списка, вам нужно установить следующий указатель во втором последнем элементе равным null. Поэтому для find() недостаточно вернуть элемент, который вы хотите удалить, - вам нужен предыдущий элемент.

псевдокод для удаления (данные) должен быть (непроверенным):

if head == null 
    return 
if head.data == data 
    head = head.next 
    return 
previous = find_previous(data) 
if previous == null 
    return 
previous.next = previous.next.next 
+0

вам следует лучше изменить последнюю строку вашего кода следующим образом: 'Node delNode = previous.next; previous.next = previous.next.next; delNode.next = null; delNode = null; 'для того, чтобы не было утечки памяти. – smttsp

+0

Нет утечки памяти. Да, удаленный узел ничего не ссылается на него, но по этой причине сборщик мусора очистит его. Нет необходимости, чтобы удаленный узел ни к чему не обращался, чтобы получить сбор мусора. – Bull

+0

Ой, я этого не знал. благодаря – smttsp

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