我想从链表中删除一个节点。链接列表包含以下类型的数据(包含有空格的数据(
aa 1 1 1 1
bb 2 2 2 2
ab 3 3 3 3
cc 4 4 4 4
dd 5 5 5 5
问题是我的代码只删除了我用dd 5 5 5 5创建的最后一个节点,而没有其他内容!请阅读我的代码,并向我建议任何解决方案,为什么会发生在我身上?
public Node del(String key){
Node p=first;
for(Node c=first;c!=null;c=c.next)
{
if(c.data.startsWith(key)){
if(c.next==null){
return null;
}else{
p=c;
}
if(c==first)
first=first.next;
else
p.next=c.next;
return c;
}
}
return null;
}
提前感谢!
在迭代中,您需要维护当前节点(c
(和上一个节点('p'(。然后,如果您发现c
具有您要查找的密钥,则设置p.next = c.next
。这将从列表中删除c。然后测试空列表、带有一个元素的列表和带有两个元素的清单的代码,因为在这些特殊情况下,您需要以不同的方式处理删除。
您的代码有几个问题。唯一实际有效的情况是删除列表的第一个元素。
我认为找到正确的解决方案比我给你的时候学到了更多。试着在纸上画出列表的草图,并在程序运行时观察变量p
和c
所指的节点。
当单步执行程序时,在调试器中查看执行情况也可能很有帮助。
更改您的逻辑如下:
public Node del(String key)
{
Node p = null;
for(Node c=first;c!=null;p=c;c=c.next)
{
if(c.data.startsWith(key))
{
if(c==first)
first=first.next;
else
p.next=c.next;
c.next = null;
return c;
}
}
return null;
}
若要删除链接列表中的节点,则应具有对其上一个节点的引用。CCD_ 6是在当前节点CCD_。检查如何修改for
循环。
您的主要问题(还有其他问题,但我将重点讨论您要求的问题(是p总是指向第一个链接。当你找到钥匙时,你会执行p.next = c.next
,所以如果你的物品是在最后一个链接上找到的,那么first.next
将跳过所有其他有效链接指向最后一个链路。
例如:
1->2->3->4->5
如果我查找键=4,则列表将显示为:
1->5
for(currentnode=start; currentnode!=null; currentnode=currentnode.delnext){
if(currentnode.deldata.startsWith(mykey)){
if(currentnode==start)
start=start.delnext;
else
prevnode.delnext=currentnode.delnext;
currentnode.deldata=null;
}
prevnode=currentnode;
}
}
这个代码会像符咒一样工作,我已经更正了我的代码!感谢上帝