java - 在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());
}
}
解决方案
我不会直接回答这个问题,而是建议一种针对这类问题的通用方法。
要针对这些问题,首先,您需要设计算法。如我所见,您已经想出了一个临时变量并让它遍历链表。但是,它似乎还不够成熟。
其次,您需要考虑类的数据封装和职责。我看到您的myexample
课程包含三个字段:head
、tail
和size
。那么,责任是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
次数。循环在第一次迭代中断开链接,然后在接下来的迭代中什么也不做。该循环中似乎存在错误,我想您已经注意到错误是什么以及如何修复它。
推荐阅读
- python - 有人可以帮助解释这个回溯算法中的递归吗?
- android - ViewPager 在 CoordinatorLayout 内时不会垂直滚动
- image - 图像 URL 的 FXML 变量标记
- python - 如何使这张图表更易于阅读?
- javascript - React Native:使用按钮运行一个类
- node.js - 使用 mongoose 检索不同的聚合字段
- c++ - 自动函数返回类型 + 右值重载 = 模棱两可的调用?
- javascript - ajax加载器加载时隐藏导航栏
- java - 如何使用 LambdaMetaFactory 在运行时创建代理对象?
- angular - 我无法向我自己的 Spring 引导服务器发出 Angular Http 请求