2014-02-07 4 views
0

Пытается написать метод, который удаляет все экземпляры значения из отдельного списка, но он не работает.Отдельно связанный список: Удаление

Я пытался приспособить для того, содержит ли голова значение, но я не уверен, является ли это правильный способ сделать это:

public void remove (int value) 
{ 
    if (head.value == value) 
    { 
    head = head.next; 
    count--; 
    } 
    IntegerNode temp=head; 
    while (temp !=null) 
    { 
     if (temp.next != null) 
     { 
      if (temp.next.value == value) 
      { 
       temp.next = temp.next.next; 
       count--; 
      } 
     } 
     temp=temp.next; 
    } 
} 

Есть ли что-то очевидно не так с моим код?

+0

чем проблема exacly, и почему вы используете count-- –

+1

Подсчет показывает, сколько значений в списке. – user3283585

+0

введите оператор if после цикла while –

ответ

0

здесь различные способы удаления из списка Linked

public Node removeAtFront() 
    { 
     Node returnedNode = null; 

     if(rootNode !=null) 
     { 

      if(rootNode.next !=null) 
      { 
       Node pointer = rootNode; 
       returnedNode = rootNode; 
       pointer = null; 
       rootNode = rootNode.next; 
      } 
      else 
      { 
       Node pointer = rootNode; 
       returnedNode = rootNode; 
       pointer = null; 
       rootNode = rootNode.next; 
       System.out.println("removing the last node"); 
      } 
     }else 
     { 
      System.out.println("the linkedlist is empty"); 
     } 

     return returnedNode; 
    } 

    public Node removeAtBack() 
    { 
     Node returnedNode = null; 

     if(rootNode != null) 
     { 
      //Remove the commented line if you wish to keep 1 node as minimum in the linked list 
      //if(rootNode.next !=null) 
      //{ 
       Node pointer = new students(); 
       pointer = rootNode; 

       while(pointer.next.next !=null) 
       { 
        pointer=pointer.next; 
       } 

       returnedNode = pointer.next.next; 
       pointer.next.next = null; 
       pointer.next = null; 
      //} 
      //else 
      //{ 
      // System.out.println("cant remove the last node because its the root node"); 
      //} 
     } 
     else 
     { 
      System.out.println("the linkedlist is empty"); 
     } 

     return returnedNode; 
    } 

    public Node removeNode(String name) 
    { 
     Node returnedNode = null; 

     if(rootNode !=null) 
     { 
      Node pointer = new students(); 
      Node previous = new students(); 

      pointer = rootNode; 


      while(pointer !=null) 
      { 
       if(pointer.name.equals(name)) 
       { 
        previous.next = pointer.next; 
        returnedNode = pointer; 
        pointer = null; 

        break; 
       } 
       else 
       { 
        previous = pointer; 
        pointer = pointer.next; 
       } 
      } 

     } 
     else 
     { 
      System.out.println("the linkedlist is empty"); 
     } 

     return returnedNode; 
    } 

    public boolean isEmpty() { 

     return rootNode == null; 
    } 
0

Вы должны отслеживать, где вы были в списке, а не там, где вы собираетесь. Как это:

public void remove (int value) 
{ 
    IntegerNode current = head; 

    while (current !=null) 
    { 
     if (current.value == value) 
     { 
      if (head == current) 
      { 
       head = current.next; 
      } 
      else 
      { 
       head.next = current.next; 
      } 
      count--; 
     } 
     current=current.next; 
    } 
} 
+0

Что такое «equals (current)»? будет ли это сравнивать предыдущее значение с текущим значением и возвращать true или false? Я попытался заменить это на «previous.value == current.value», и это тоже не сработало. EDIT: ваш точный код также создает исключение nullpointer. – user3283585

+0

@ user3283585 Вы ​​правы. Я думал об этом и вместо этого изменил его на предмет равенства. Где именно он генерирует npe? – mikea

+0

Странно, это, кажется, указывает на другую область моего кода вообще, моя команда «получить», когда говорит «return temp.value;». – user3283585

1

Здесь реализация связанного списка с add и remove методов с тестом.

public class ListDemo { 
    public static void main(String[] args) { 
     MyList list = new MyList(); 
     list.addToEnd(1); 
     list.addToEnd(2); 
     list.addToEnd(3); 

     list.removeByValue(2); 
     list.removeByValue(3); 
    } 

} 

class MyList { 
    private IntegerNode head; 
    private int count = 0; 

    public void addToEnd(int value) { 

     if(head == null) { 
      head = new IntegerNode(value); 
      count = 1; 
      head.next = null; 
      return; 
     } 
     IntegerNode current = head; 
     while (current.next != null) { 
      current = current.next; 
     } 
     IntegerNode node = new IntegerNode(value); 
     node.next = null; 

     count++; 
     current.next = node; 
    } 

    public void removeByValue(int value) { 
     if (count == 0) { 
      return; 
     } else if (count == 1) { 
      if (head.value == value) { 
       count = 0; 
       head = null; 
      } 

     } else { 
      IntegerNode current = this.head; 
      IntegerNode next = current.next; 
      while (next != null) { 
       if (next.value == value) { 
        if (next.next == null) { 
         current.next = null; 
         count--; 
         return; 
        } else { 
         current.next = next.next; 
         count--; 
        } 
       } 
       next = next.next; 
      } 
     } 
    } 
} 

class IntegerNode { 
    IntegerNode(int value) { 
     this.value = value; 
    } 

    IntegerNode next; 
    int value; 
} 
+0

Если я не вызываю метод add, но вызываю только удалить счетчик NullPointer, потому что он не может инициализироваться. – herry

+0

OK, сейчас я посмотрю –

+0

Я добавил чек для случая 'count == 0'. –

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