我正在尝试从链接列表中删除给定的节点。我不知道为什么我的代码不起作用。任何提示? 所以我有[11,21,31,41]并且他们要求我在这种情况下删除索引2处的节点31.到目前为止,我有这个:
public void delete (int k) {
//[ 11 21 31 41 ].delete( 2 ): expected=[ 11 21 41 ]
if (k < 0 || k >= N) throw new IllegalArgumentException ();
for(Node x = first; x != null; x = x.next) {
//deletes node
if(x.item == k){
x = x.next;
}
if(x.item <= k){
x = x.next.next;
}
}
}
有人可以告诉我,为什么这不起作用?谢谢
答案 0 :(得分:0)
您可以使用下一个k
次移动节点。存储临时int和前一个节点。每次调用next()
时减少临时int。一旦处于0(所需元素),通过将前一个节点的下一个指针设置为x的下一个指针来删除,然后将x
设置为null
。
我认为在你的代码中你缺少设置指针的部分。
例如:
(1) -> (2) -> (3)
要删除(2)
,请设置(1).next = (3)
和(2) = null
。这将得到:
(1) -> (3)
答案 1 :(得分:0)
这里有一些问题,我鼓励你进行一些println调试,以便在开发时更好地理解这些问题。
假设item
字段是Node的值,您将节点的值与所述节点的索引进行比较(例如x.item == k
)。
您要遵循的一般逻辑是,“如果迭代器指向的节点是我列表中的下一个节点,请将next
设置为next
}“。
答案 2 :(得分:0)
在您的代码中,您将节点的值与您传递的索引进行比较。此比较将始终具有小于节点中的值的索引。此后,当您假设代码正确时,您不会更新节点。
下面的代码应该会给你结果。
public void delete (int k)
{
//[ 11 21 31 41 ].delete( 2 ): expected=[ 11 21 41 ]
if (k < 0 || k >= N) throw new IllegalArgumentException ();
int count = 0;//Assuming index starts from 0
Node prev;
for(Node x = first; x != null; x = x.next)
{
//deletes node
count++;
if(count<k)
{
prev = x;
continue;
}
else
{
prev.next = x.next;
x.next = null;
break;
}
}
if(count>k || count<k)
{
System.out.println("No element with index k");
}
}
答案 3 :(得分:0)
@vase说得对
假设item字段是Node的值,您需要进行比较 节点的值到所述节点的索引(例如x.item == k)。
可以解决此问题的一些示例代码
public void delete(int k){
Node n = first;
for(int i = 0; i < k-1; i++){ // this loop finds the node right before the
n=n.next; // index to use to delete the desired index.
}
n.next = n.next.next; // delete command
}