簡體   English   中英

無法刪除鏈表中的最后一個節點

[英]Unable to delete last node in linked list

我試圖從單鏈接列表中刪除最后一個節點。 但是我仍然無法解決代碼中的此錯誤。 我的deleteFromEnd方法沒有刪除最后一個節點。 調用delete方法后,它仍顯示我要刪除的節點。 列表的其余部分將被刪除,但最后一個節點本身不會被刪除。 您能告訴我我所缺少的是什么,或者錯誤在哪里?

鏈表:

package lab5;

public class LinkedList {

    public static void main(String argsp[]) {
        List ob = new List();

        ob.addAtStart("y", 6);
        ob.addAtStart("w", 4);
        ob.addAtStart("z", 3);

        ob.addAtEnd("a", 3);
        ob.addAtEnd("b", 4);
        ob.addAtEnd("c", 5);

        /*
         * ob.display(); System.out.println("Deleted first one");
         * ob.deleteFromStart();
         */
        ob.display();
        System.out.println("Deleted End one");
        ob.deleteFromEnd();
        ob.display();
    }
}

清單:

package lab5;

public class List {

    Node head;

    public List() {
        head = null;
    }

    public List(Node e) {
        head = e;
    }

    Node oldfirst = null;
    Node lasthead = null;

    public void addAtStart(String name, int age) {
        Node newObject = new Node(name, age);
        newObject.next = head;

        if (oldfirst == null) {
            oldfirst = newObject;
        }
        head = newObject;
        lasthead = head;

    }

    public void display() {
        Node store = head;
        while (store != null) {
            store.display();
            store = store.next;
            System.out.println();
        }
    }

    public void addAtEnd(String name, int age) {
        Node atEndValue = new Node(name, age);
        oldfirst.next = atEndValue;
        oldfirst = atEndValue;
    }

    public void deleteFromStart() {
        if (head.next != null) {
            head = head.next;
        }
    }

    public void deleteFromEnd() {
        Node start = head;
        Node prev = null;
        while (head != null) {
            prev = head;
            head = head.next;
        }
        prev.next = null;
        head = prev;
    }

    public Node search(String name) {
        return head;
    }

    public boolean isEmpty() {
        return head == null;
    }

    public int size() {
        return (head.toString()).length();
    }
}

節點:

package lab5;

public class Node {

    String name;
    int age;
    Node next;

    public Node() {
        name = "Abc";
        age = 10;
        next = null;
    }

    public Node(String name, int age) {
        this.name = name;
        this.age = age;
        next = null;
    }

    public void display() {
        System.out.println("Name: " + name + " Age: " + age);
    }
}

您正在修改列表的頭指針,這是錯誤的。 以下方法對我有用。

   public void deleteFromEnd() {
        Node start = head;
        Node prev = null;

        if(start == null || start.next == null)
        {
            head = null;
            return;
        }
        while (start.next != null) {
            prev = start;
            start = start.next;
        }
        prev.next = null;
    }

在對您的代碼進行了更多分析之后,我發現了其他一些問題。 您將需要更新addAtStartaddAtEnd方法。

Node lasthead = null;

public void addAtStart(String name, int age) {
    Node newObject = new Node(name, age);
    newObject.next = head;
    if(head == null)
        lasthead = newObject;
    else if(head.next == null)
        lasthead = head;

    head = newObject;

}


public void addAtEnd(String name, int age) {
    Node atEndValue = new Node(name, age);
    lasthead.next = atEndValue;
    lasthead = atEndValue;
}

原因是,假設我要從列表末尾刪除單個節點。 我將無法在列表末尾添加元素。

當您從單鏈列表的末尾刪除時,您必須執行以下操作:

  1. 遍歷列表,並創建一個變量以引用列表的倒數第二個元素。

  2. 將倒數第二個節點之后的節點設置為null

在遍歷鏈接列表時,切勿更改head的值,因為這會有效刪除整個列表。 由於您已經覆蓋了head變量,因此無法找到回到起點的方法。 而是使用初始化為head的臨時變量進行迭代。

最后,請記住考慮列表僅包含1個元素或已經為空的邊緣情況:

public void deleteFromEnd() {
    Node current = head;
    Node previous = null;

    while (current != null && current.next != null) {
        previous = current;
        current = current.next;
    }

    if (current == head) {
        head = null;
    }

    if (previous != null) {
        previous.next = null;
    }
}

不要更改鏈接列表的標題,否則您將丟失列表。 嘗試對功能進行以下修改:

public void deleteFromEnd() {
        Node start = head;
        Node prev = null;
        if(start == null){
           return;
        }
        if (start.next == null){
           head = null;
           return;
        }
        while (start.next != null) {
            prev = start;
            start = start.next;
        }
        prev.next = null;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM