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

Java删除节点链表不工作

戎泰
2023-03-14

我有一种工作方法,可以在给定键的情况下删除链表中的节点。那时我将节点类嵌套在LinkedList类中,可以直接访问节点类的成员(例如head.next和head.data)。我对代码进行了重构,使其具有一个单独的节点类,并为数据和下一个成员设置了访问器和mutator方法。(我正在准备面试,所以我正在处理许多linkedlist问题,所以我认为有一个单独的类可以让我不必复制和粘贴很多代码。

这是我的Node.java:

package linkedlistproblems;

public class Node {
    private int data;
    private Node next;

    public Node(int data) {
        this.data = data;
        this.next = null;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}

我从LinkedList中删除节点的方法。爪哇:

// delete node with key = data
public void deleteNode(int data) {
    System.out.println("Deleting node with key = " + data);
    if (head == null) {
        System.out.println("Linked list does not contain key = " + data);
        return;
    }
    else if (head.getData() == data) {
        Node temp = head;
        head = head.getNext();
        nElements--;
        temp = null;
    }
    else {
        Node n1 = head;
        Node n2 = head.getNext();
        while(n2 != null) {
            if (n2.getData() == data) {
                n1.getNext().setNext(n2.getNext());
                nElements--;
                break;
            }
            n1 = n1.getNext();
            Node temp = n2;
            n2 = n2.getNext();
            temp = null;
        }
        if (n2 == null)
            System.out.println("Linked list does not contain key = " + data);
    }
}

这种方法行不通。它在检查数据后进入if,但不删除节点。

以下是行之有效的旧方法:

// delete node with key = data
public void deleteNode(int data) {
    System.out.println("Deleting node with key = " + data);
    if (head == null) {
        System.out.println("Linked list does not contain key = " + data);
        return;
    }
    else if (head.data == data) {
        Node temp = head;
        head = head.next;
        nElements--;
        temp = null;
    }
    else {
        Node n1 = head;
        Node n2 = head.next;

        while (n2 != null) {
            if (n2.data == data) {
                n1.next = n2.next;
                nElements--;
                break;
            }
            n1 = n1.next;
            Node temp = n2;
            n2 = n2.next;
            temp = null;
        }

        if (n2 == null) 
            System.out.println("Linked list does not contain key = " + data);
    }
}

下面是测试代码的主要方法:

public static void main(String[] args) {
    LinkedList ll = new LinkedList();
    ll.add(70);
    ll.add(10);
    ll.add(55);
    ll.add(22);
    System.out.println("Original List: " + ll);
    ll.deleteNode(70);
    System.out.println(ll);
    ll.deleteNode(22);
}

我已经重写了toString方法来漂亮地打印链表(这里没有显示)。我不知道为什么使用访问器变体的重构方法不起作用。

输出:

Original List: 70 ---> 10 ---> 55 ---> 22 ---> NULL
Deleting node with key = 70
10 ---> 55 ---> 22 ---> NULL
Deleting node with key = 22
10 ---> 55 ---> 22 ---> NULL
10 ---> 55 ---> 22 ---> NULL

此外,每当我删除一个节点时,我都会将其分配给temp,将其从列表中删除,并将temp分配给null。我这样做是为了防止游荡。我这样做对吗?

谢谢你的帮助!

共有1个答案

姜乐家
2023-03-14

原台词的逻辑

n1.next = n2.next;

与新实现不匹配

n1.getNext().setNext(n2.getNext());

这相当于

n1.next.next = n2.next;

从最初的实施

 类似资料:
  • 我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)

  • 问题内容: 这段代码是一个表,可以选择“惰性名称”,“删除”,“显示”和“退出”。 该代码运行良好,但是我唯一的问题是如何删除节点中的所选名称 *我不知道如何删除节点。我应该在删除方法上加上什么? 问题答案: 要删除Node,您实际上需要更新它的上一个节点的位置以删除Node的位置,而剩下的Node最终将被垃圾回收。 如果要删除的节点是根节点,则只有一个问题,然后更新根节点。

  • 我正在学习数据结构,并试图理解Java中的链接列表。我的问题是,我有麻烦与删除节点在给定的索引递归。我的目标是得到O(log n),而不是使用循环,最后得到O(n)。 因此,当我试图删除索引2的条目时,它会删除该索引之前的所有数字,但不会删除该索引-因此它会删除[0]和[1],但不会删除[2]。 例如,在此代码中,删除前的数组填充为:。调用后,它有以下条目: 我只想删除13,这样数组就会像这样:

  • 我理解得对吗?(从虚拟节点开始) dummy->a->b->c->d->dummy(环绕到dummy节点) 因此,如果我想删除第一个实际的数据段(A),我需要将它分配给一个临时变量。所以Node first=head.next。然后我需要有一个虚拟的头部引用“B”,所以我需要做head.next=first.next。这就是所有需要做的吗? 在从列表中删除任何节点N的情况下(假设它在列表中),这是

  • 我有一个基本的链表问题,我在下面试图解决。如果您能为我的方法、算法的正确性(甚至是编码风格)提供任何信息,我将不胜感激。该问题需要一个函数,该函数删除循环链表中所有出现的int,并返回列表中的任何节点或NULL(当列表为NULL时)。 以下是我目前掌握的一些C代码:

  • 这是我的remove函数,用于删除具有元素的节点。我得到了一个seg错误,我很确定这是因为temp->prev是前面的哨兵,所以从技术上来说,它不在双链表中。如果这是正确的,我实际上如何防止这种情况?如有任何帮助,不胜感激。 编辑:刚刚更新了代码,但仍然出现了Seg错误