Удалить узел, которому присвоен ключ в связанном списке

#java

#java

Вопрос:

Я написал код для удаления узла из связанного списка с заданным ключом. Однако, когда я пытаюсь удалить первый узел здесь, а затем просмотреть мой список, он по-прежнему показывает первый узел, который существовал ранее. Может кто-нибудь сказать мне, что я здесь делаю не так? Весь мой код, начинающийся с имени класса

 public class LinkedList {
    //removing Node nested class





    public void buildList1() {
        head=new Node(1);
        head.next=new Node(3);
        head.next.next=new Node(5);
        head.next.next.next=new Node(7);


    }

    public boolean removeNode(Node head,int x) {
        //1 3 5 7---to delete 5
        Node q=head;//q
    //  Node p=head.next;//p
        Node prev=null;

        if(q!=null amp;amp; q.data==x) {
            head=q.next;
            //q=null;
            System.out.println("next to head"   head.data);
            return true;
        }
        while(q!=null amp;amp; q.data!=x) {
            prev=q;
            q=q.next;
        }
        if(q==null)
            return false;
        prev.next=q.next;

        return true;

    }

    public void printList() 
    { 
        Node tnode = head; 
        while (tnode != null) 
        { 
            System.out.print(tnode.data " "); 
            tnode = tnode.next; 
        } 
    } 

    public static void main(String args[]) {
        LinkedList list=new LinkedList();
        list.buildList1();


        list.printList();
        System.out.println(list.removeNode(list.head, 1));
        list.printList();

    }

}
  

Комментарии:

1. В сторону: if(q.data==x amp;amp; q!=null) условия здесь должны быть перевернуты

2. Можете ли вы предоставить более полный набор вашего кода? Можете ли вы опубликовать, как выглядит весь ваш класс LinkedList? Ваш removeNode метод не должен принимать головной узел в качестве параметра. Головной узел должен быть переменной экземпляра класса LinkedList.

3. Ваш LinkedList класс должен отслеживать свой собственный head , а не принимать его в качестве параметра (для любого из своих методов) — поэтому он должен начинаться как public class LinkedList { private Node head; ...}

Ответ №1:

у @JD D был хороший ответ, но я бы сделал removeNode метод еще проще.

 public boolean removeNode(int x) {
    tempNode = this.head;
    prevNode = null;
    if (this.head != null amp;amp; this.head.data == x) {
        this.head = this.head.next;
        return true;
    }
    while (tempNode != null) {
        if (tempNode.data == x) {
            prevNode.next = tempNode.next;
            return true;
        }
        prevNode = tempNode;
        tempNode = tempNode.next;
    }
    return false;
}
  

Комментарии:

1. вы должны поместить if (this.head.date == x) логику перед циклом … нет причин запускать эту проверку в каждом цикле, поскольку она не меняется

2. это верно, но это должно быть двойное условие, if (this.head != null amp;amp; this.head.data == x) иначе оно выдаст a, NullPointerException если List будет пустым

Ответ №2:

Добавьте head в качестве переменной экземпляра и удалите этот параметр из вашей функции removeNode. Вы должны иметь возможность ссылаться на эту переменную в своих методах, используя this ключевое слово.

Что-то вроде этого (непроверено, но надеюсь, вы поняли идею):

 public class LinkedList {
    //removing Node nested class

    private Node head;

    public void buildList1() {
        this.head=new Node(1);
        this.head.next=new Node(3);
        this.head.next.next=new Node(5);
        this.head.next.next.next=new Node(7);


    }

    public boolean removeNode(int x) {
        Node q=this.head;
        Node prev=null;

        if(q!=null amp;amp; q.data==x) {
            this.head=q.next;
            return true;
        }
        while(q!=null amp;amp; q.data!=x) {
            prev=q;
            q=q.next;
        }
        if(q==null)
            return false;
        prev.next=q.next;

        return true;

    }

    public void printList() 
    { 
        Node tnode = this.head; 
        while (tnode != null) 
        { 
            System.out.print(tnode.data " "); 
            tnode = tnode.next; 
        } 
    } 

    public static void main(String args[]) {
        LinkedList list=new LinkedList();
        list.buildList1();

        list.printList();
        System.out.println(list.removeNode(1));
        list.printList();
    }

}
  

Ответ №3:

 public static void main(String args[]) {
    LinkedList list=new LinkedList();
    list.buildList1();
    list.printList();
    list.remove(2);
    list.printList();

}
  

LinkedList имеет библиотеку методов, одним из которых является remove (int index). Используйте его, как показано.

Комментарии:

1. Во встроенном классе нет такого понятия, как buildList1() или printList(). Я думаю, что это какой-то пользовательский класс для школьного проекта или что-то в этом роде.

2. В этом случае я бы посоветовал посмотреть исходный код unlink (узел<E> x). и манипулировать им в соответствии с вашим случаем.

3. Очевидно, что это личный / школьный проект. Использование встроенных библиотек противоречит цели.

Ответ №4:

Ваша жизнь будет проще, если ваш head узел не будет вашим первым узлом, а ваш первый реальный узел будет next вашим (исправленным) head .

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

Ответ №5:

Попробуйте напрямую использовать список, который вы создали. Возможны два решения. Во-первых: используйте созданный список

  if (q != null amp;amp; q.data == x) {
        this.head = q.next;//use this to refer the list you created
        // q=null;
        System.out.println("next to head"   head.data);
        return true;
    }
  

Второе: передать сам список

   public boolean removeNode(LinkedList list, int x) {
    // 1 3 5 7---to delete 5
    Node q = list.head;// q
   }

  //Call it like this
  System.out.println(list.removeNode(list, 1));