当前位置: 首页 > 知识库问答 >
问题:

无法删除链表中的最后一个节点

贺元明
2023-03-14

我正在尝试从单链接列表中删除最后一个节点。但我仍然无法在代码中解决此错误。我的deleteFromEnd方法没有删除最后一个节点。调用delete方法后,它仍然显示我要删除的节点。列表的其余部分将被删除,但最后一个节点本身不会被删除。你能告诉我我遗漏了什么,或者错误在哪里吗?

LinkedList:

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);
    }
}

共有3个答案

商俊智
2023-03-14

不要更改链表的标题,否则会丢失链表。尝试对函数进行以下修改:

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;
    }
戚学文
2023-03-14

当您从单链接列表的末尾删除时,您必须执行以下操作:

>

  • 遍历列表,并创建一个变量来引用列表中倒数第二个元素

    将倒数第二个节点之后的节点设置为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;
        }
    }
    

  • 段溪叠
    2023-03-14

    您正在修改列表的头指针,这是错误的。下面的方法对我有效。

       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;
    }
    

    原因是,假设我从列表末尾删除一个节点。我将无法在列表末尾添加元素。

     类似资料:
    • 问题内容: 我正在练习使用链表节点,遇到了一个我不知道如何回答的问题。如何删除链接列表中的最后一个节点。下面的代码适用于所有条目的最后一个节点。最后一个不会被删除。 节点类别 主要 问题答案: 我想您的最后一个元素失败了。最后一个元素将没有元素。因此,不会将最后一个元素与传递的字符串进行比较。您应该使用调试器进行跟踪。

    • 公共类LinkedList11{//私有内部类节点 }

    • 我正在做一个双链表的实现。我希望链表有一定的长度限制。当列表变长时,删除最后一个节点。我这里有些问题。我想定义尾巴,这样我就不必寻找终点。下面是我正在研究的实现,它将允许长度为4,然后开始删除最后一个节点。 它似乎在删除最后一个节点,但之后会打印一些奇怪的符号。我猜这是我如何释放的问题,但我想不出来。注意:此代码中的一些代码取自https://gist.github.com/mycodeschoo

    • 我正在用C语言创建一个单链表,它有头部和尾部指针,其中头部指针指向SLL的起始节点,尾部指针指向SLL的最后一个节点。我不想使用head指针遍历到列表末尾来删除节点。有没有办法让我可以使用尾指针删除SLL的最后一个元素? 下面是节点添加函数。头部和尾部初始化为NULL。 要删除第一个节点,使用以下函数:

    • 我正在为我的Data Structures类编写一个项目,该项目要求我编写一个类来实现INT的链接列表。 为节点使用内部类 包括以下方法 编写一个测试程序,使您能够以任意顺序使用所需的任何数据测试所有方法 我必须创建一个名为“public int deleteFromFront()”的方法。此方法旨在“删除列表前面的节点,并返回其中的int,如果列表为空,则返回null。”下面是我的代码。然而,当

    • 以下代码删除双链接列表中的第一个节点。 如果列表只包含1个元素,我们将last的引用设置为null。我的问题是,我们为什么不将first的引用设置为null?这会有什么不同吗?