>我在这里开始了这个问题的基础,并被告知要开始一个新线程: 删除链表中的元素
我完成了下面的代码:
public class MyLinked {
static class Node {
public Node (double item, Node next) { this.item = item;
this.next = next; }
public double item;
public Node next;
}
int N;
Node first;
public void delete (int k) {
if (k < 0 || k >= N) throw new IllegalArgumentException ();
if (k == 0) {
Node temp = first;
first = first.next;
temp.next = null;
}else {
Node previous = first;
while (k < N -1) {
previous = previous.next;
k++;
}
Node current = previous.next;
previous.next = current.next;
current.next = null;
N--;
}
}
我想我指向正确的节点来删除第 k 个元素,但是,这是测试返回的内容:
[ 11 21 31 41 ].delete( 0 ): Expected 4 nodes, but got less.
[ 11 21 31 41 ].delete( 1 ): expected=[ 11 31 41 ], actual=[ 11 21 31 ]
[ 11 21 31 41 ].delete( 3 ): expected=[ 11 21 31 ], actual=[ 11 31 41 ]
[ 11 21 31 41 51 ].delete( 0 ): Expected 5 nodes, but got less.
[ 11 21 31 41 51 ].delete( 1 ): expected=[ 11 31 41 51 ], actual=[ 11 21 31 41 ]
[ 11 21 31 41 51 ].delete( 2 ): expected=[ 11 21 41 51 ], actual=[ 11 21 31 51 ]
[ 11 21 31 41 51 ].delete( 3 ): expected=[ 11 21 31 51 ], actual=[ 11 21 41 51 ]
[ 11 21 31 41 51 ].delete( 4 ): expected=[ 11 21 31 41 ], actual=[ 11 31 41 51 ]
我认为错误在于,当它尝试删除 [0] 时,它会在 [1] 处删除,当 [1] 在 [2] 处删除时。 我想它是从 [1] 而不是 [0] 作为列表中的第一个节点开始的? 非常感谢有关如何调整我的代码以正确阅读的任何帮助。
以下是测试代码:
private static void testDelete (int k, String list, String expected) {
MyLinked actual = MyLinked.of (list);
String message = String.format ("[ %s ].delete( %d )", list,
k);
try {
actual.delete (k);
} catch (Throwable e) {
String exception = e.getClass ().getName ();
if (! exception.equals (expected)) {
e.printStackTrace (); // for debugging
showError (String.format ("%s: expected=%s,
actual=%s", message, expected, exception));
}
return;
}
check (message, actual, expected);
}
我能够调整我的代码并得到正确的答案。 工作代码如下:
public void delete (int k) {
if (k < 0 || k >= N) throw new IllegalArgumentException ();
if (k == 0) {
Node temp = first;
first = first.next;
temp.next = null;
N--;
}
else {
Node previous = first;
int count = 0;
while (count < k-1) {
previous = previous.next;
count++;
}
Node current = previous.next;
previous.next = current.next;
current.next = null;
N--;
}
}
我添加了 int count 并将计数器设置为从 0 开始。 当我让它从 1 开始时,这就是它删除错误值的原因。
我还需要在函数的 (k==0( 部分添加 N-- 以调整列表的大小,如果列表只包含一个元素,并且该元素被删除。