首页 > 解决方案 > 在java中删除LinkedList中的节点

问题描述

我需要从 java 中的链表中删除一个节点,给定一个表示要删除的索引的 int。列表的头部和尾部是在方法之外定义的,它们是在类中定义的。我已经定义了下一个节点,以及另一个公共类中节点内的数据,并为它们设置了 getter 和 setter。我需要返回在要删除的节点中找到的数据,然后相应地调整头部、尾部和大小(类中定义的变量)。

public class myExample<T> {
    private Node<T> head;
    private Node<T> tail;
    private int size;

    public T removeAtIndex(int index) {
        if (index < 1 | (index + 1) > size) {
            throw new IllegalArgumentException("Index out of bounds");
        }
        Node tempNode = head;
        if (index == 0) {
            head = tempNode.getNext();
        }
        for (int i = 0; tempNode != null && i < index - 1; i++) {
            tempNode.setNext(tempNode);
        }
        return (T) tempNode.getNext().getNext();
        tempNode.setNext(tempNode.getNext().getNext());
        tempNode.setNext(tempNode.getNext());
    }
}

标签: javagenericslinked-listnodes

解决方案


我不会直接回答这个问题,而是建议一种针对这类问题的通用方法。

要针对这些问题,首先,您需要设计算法。如我所见,您已经想出了一个临时变量并让它遍历链表。但是,它似乎还不够成熟。

其次,您需要考虑类的数据封装和职责。我看到您的myexample课程包含三个字段:headtailsize。那么,责任是myexample什么?那是linkedlist包装器实现吗?如果是这样,它需要有其他适当的方法。您需要确定类的角色和职责。

顺便说一句,具有 atail类似于实现是 a Doubly-linked-list。但是,您的代码没有关于pre链接的任何内容。看来你也需要解决这个问题。

然后,在你画出草图之后,你就可以开始编码了。您在该实施阶段的第一个任务是将您的想法转换为可编译的编程语言语句。所以,输入你的代码,完成后,编译它。您上传的代码无法编译。你需要解决这个问题。

拥有一个测试用例也是一个好主意,这样您就可以运行和调试您的代码。您需要考虑和设计测试用例的细节。在您的示例中,测试代码应创建一个链表并调用removeAtIndex.

考虑那段代码:

    for (int i = 0; tempNode != null && i < index - 1; i++) {
        tempNode.setNext(tempNode);
    }

让我们追踪它。在循环之前,tempNode被分配给某物(实际上head)。循环迭代,并且 tempNode 的下一个指针被分配给它自己(因此失去了到链表其余部分的链接)。您不会tempNode在循环中更新,因此代码会执行该index-1次数。循环在第一次迭代中断开链接,然后在接下来的迭代中什么也不做。该循环中似乎存在错误,我想您已经注意到错误是什么以及如何修复它。


推荐阅读