在java中删除LinkedList中的Node



我需要从java中的链表中删除一个Node,给定一个表示要删除的索引的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());
}
}

与其直接回答这个问题,不如建议一种针对这类问题的通用方法。

要针对这些问题,首先,您需要设计算法。正如我所看到的,您已经找到了一个临时变量,并让它遍历链表。然而,它似乎还不够成熟。

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

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

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

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

考虑一下这段代码:

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

让我们追踪一下。在循环之前,tempNode被分配给某个东西(实际上是head(。循环迭代,tempNode的下一个指针被分配给它自己(从而丢失了与链表其余部分的链接(。您没有在循环中更新tempNode,因此代码会更新index-1的次数。循环在第一次迭代中断开链接,然后在接下来的迭代中不执行任何操作。这个循环中似乎有一个错误,我想你已经注意到这个错误是什么,以及如何修复它

最新更新