2016-08-06 4 views
0

Я пытаюсь удалить узлы с заданным ключом, а также хочу отображать обновленные значения хвостового и головного узлов. Я могу удалить первый узел (Head) и не может удалить Tail узел Пожалуйста, проверьте мой код нижеПопытка удалить узел в одиночном круговом связанном списке

public void delete(int key){ 
     Node current = head;    
     while(current.next.data != key){ 
      current = current.next; 
     } 
     if(current.next.data == key){    //deleting current node 
      current.next = current.next.next; 
      if(current.next == head) 
       tail = current; 
      else if(current == head) 
       head = current.next;  
     } 
    } 

Мой главный метод:

public class Caller { 
    public static void main(String args[]){ 

      Linklist theList = new Linklist(); 
      theList.insertFirst(22); 
      theList.insertFirst(44); 
      theList.insertFirst(55); 
      theList.insertFirst(66); 
      theList.delete(22); 
      System.out.println("deleting 22"); 
      theList.display(); 
      theList.delete(66); 
      System.out.println("Deleting 66"); 
      theList.insertLast(99); 
      theList.insertLast(11); 
      theList.display(); 
    } 
} 

мой метод insertLast:

public void insertLast(int data){ 
     Node newNode = new Node(data); 
     Node current = head; 

     while(current.next != head){ 
      current = current.next; 
     } 

     current.next = newNode; 
     newNode.next = head; 
     tail = newNode; 
    } 

и мой выпуск:

deleting 22 
Displaying list first ----> last 
{ 66 } 
{ 55 } 
{ 44 } 
Head : 66 Tail: 44 
Deleting 66 

Ничего не происходит после этого кода

+0

Не могли бы вы поделиться своим методом 'insertLast()'? Вот где ваш код, кажется, застрял - не внутри 'delete()'. –

+0

updated @MickMnemonic – nitishpisal

+0

Примечание: «Ничего не происходит» очень неопределенно ... программа просто выходит из игры тихо или просто вращается, пока вы не решите ее прекратить? Это важное различие. – Lars

ответ

0

Это одна из проблем, которые лучше всего решить, пропуская алгоритм шаг за шагом с ручкой и бумагой. Я думаю, проблема заключается не в удалении хвостового узла, который ваш собственный журнал выводит как работающий, а в удалении головного узла (в этом случае «66»). Да, «66» был вставлен последним, но он был вставлен в начало чего-либо еще в списке, тем самым сделав его головным узлом.

Проблема в том, что вы изменяете структуру циклического списка перед обновлением указателей головы/хвоста. В случае удаления головного узла, когда код попадает в строку current.next = current.next.next;, current указывает на хвостовой узел, current.next является головным узлом, а current.next.next является головкой + 1 узел. Выполняя задание, current.next делается для указания на голову + 1 узел, что означает, что ни if(current.next == head), ни else if (current == head) не будут срабатывать. Главный узел теперь находится за пределами циклического списка, но указатель head все еще указывает на этот узел; и хуже, head.next все еще указывает на циклический список. больше

два вопроса:

  • Основные: метод удаления() не обрабатывает удаление последнего элемента списка
  • НЕЗНАЧИТЕЛЬНЫЕ: if(current.next.data == key) ненужно, потому что это буквально условие остановки для предыдущий цикл while.
0

Я отслеживал предыдущий и текущий узел, и это сработало!

public void delete(int key){ 
    Node current = head; 
    Node prev = current; 

    while(current.data != key){ 
     prev = current; 
     current = current.next; 
    } 
    if(current.data == key){    //deleting current node 
     if(current == head){ 
      prev = tail; 
      head = current.next; 
     }else if(current == tail){ 
      tail = prev; 
      head = current.next; 
     } 
    prev.next = current.next; 

    } 

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