单链表添加(int index, T 元素) 方法



我一直在研究这个实现单链表的项目。我一直在尝试编写 add(int index, T 元素( 方法。我有一个测试方法的测试类,但是每次测试我的SLL时,任何错误似乎都会回到我的add方法无法正常运行。

我花了几个小时研究它,编码了不同的变体,并绘制了列表的可视化以及 add 方法应该如何工作,以便尝试让它工作。不断抛出错误。

我注意到的一件事是在方法结束时,currNode 最终等同于 null,这不应该是。我希望有人可以查看下面的代码,看看我可能缺少什么。我将不胜感激任何指导或想法。

这是我到目前为止的 add 方法的代码:

@Override
public void add(int index, T element) {
// Check if index is out of bounds
if (index < 0 || index > size()) {
throw new IndexOutOfBoundsException();
}
// Current node associated with current index
Node<T> currNode = head;
// Node before target index node
Node<T> preTargetNode = null;
// New node to be added to list
Node<T> newNode = new Node<T>(element);
if (index == 0) {
addToFront(element);
} else {
for (int i = 0; i < index; i++) {
preTargetNode = currNode;
currNode = currNode.getNext();
}
preTargetNode.setNext(newNode);
newNode.setNext(currNode);
size++;
modCount++;
}
}

非常感谢大家抽出宝贵时间!

尝试在 else-condition 中像这样循环

while (currNode != null && index-- > 0) {
preTargetNode = currNode;
currNode = currNode.getNext();
}
preTargetNode.setNext(newNode);
newNode.setNext(currNode);
size++;
modCount++;

想通了问题....我需要检查前一个节点是否是尾部,如果是,则更新列表的尾部。还发现我的一种删除方法没有正确移动。

下面是 add(int index, T 元素( 方法的新代码:

@Override
public void add(int index, T element) {
// Check if index is out of bounds
if (index < 0 || index > size()) {
throw new IndexOutOfBoundsException();
}
// Current node associated with current index
Node<T> currNode = head;
// Node before target index node
Node<T> preTargetNode = null;
// New node to be added to list
Node<T> newNode = new Node<T>(element);
if (index == 0) {
addToFront(element);
} else {
for (int i = 0; i < index; i++) {
preTargetNode = currNode;
currNode = currNode.getNext();
}
preTargetNode.setNext(newNode);
newNode.setNext(currNode);
if (preTargetNode == tail) {
tail = newNode;
tail.setNext(null);
}
// Increment list size
size++;
// Increment list mod count
modCount++;
}
}