我想从链表中删除一个节点。链表包含以下类型的数据(包含具有空格的数据)
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;
}
提前致谢!
答案 0 :(得分:0)
在迭代中,您需要维护当前节点(c
)和前一个节点('p')。然后,如果您发现c
具有您要查找的密钥,请设置p.next = c.next
。这将从列表中删除c。
然后测试代码为空列表,列表包含一个元素,列表包含2个元素,因为在这些特殊情况下,您需要以不同方式处理删除。
答案 1 :(得分:0)
您的代码存在一些问题。实际工作的唯一情况是删除列表的第一个元素。
我认为你通过找到正确的解决方案比我给你的时候学到更多。尝试在纸上绘制列表草图,并在程序运行时观察变量p
和c
所指的节点。
单步执行程序时,查看调试器中的执行情况也可能会有所帮助。
答案 2 :(得分:0)
按如下方式更改逻辑:
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;
}
如果要删除链接列表中的节点,则应该引用它的上一个节点。 p
是在当前节点c
之前维护一个节点的引用。检查for
循环的修改方式。
答案 3 :(得分:0)
你的主要问题(还有其他一些问题,但我会专注于你要求的问题)是p总是指向第一个链接。当您找到关键字p.next = c.next
时,如果在最后一个链接找到您的项目,first.next
将指向跳过所有其他有效链接的最后一个链接。
例如:
1→2→3→4-→5
如果我查找 key = 4 而不是代码后,列表将如下所示:
1→5
答案 4 :(得分:0)
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;
}
}
此代码将像我修正了我的代码一样魅力!感谢上帝