0

我想从链表中删除一个节点。链表包含以下类型的数据(包含有空格的数据)

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;
    }

提前致谢 !

4

5 回答 5

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;
    }

    }

此代码将像我已更正我的代码的魅力一样工作!感谢上帝

于 2013-01-03T18:37:16.973 回答
0

在迭代中,您需要维护当前节点 ( c) 和前一个节点 ('p')。然后,如果您发现它c具有您要查找的密钥,则设置p.next = c.next. 这将从列表中删除 c。然后测试空列表、包含一个元素的列表和包含两个元素的列表的代码,因为在这些特殊情况下,您需要以不同的方式处理删除。

于 2012-12-31T09:38:11.693 回答
0

您的代码有几个问题。唯一有效的情况是删除列表的第一个元素。

我认为你通过找到正确的解决方案比我只是给你学到更多。尝试在纸上画出列表的草图,并观察变量pc程序运行时引用的节点。

在单步执行程序时查看调试器中的执行也可能会有所帮助。

于 2012-12-31T09:39:01.383 回答
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循环是如何修改的。

于 2012-12-31T09:45:46.940 回答
0

您的主要问题(还有其他一些问题,但我会专注于您要求的问题)是 p 始终指向第一个链接。当您找到密钥时p.next = c.next,如果在最后一个链接中找到您的项目,first.next则将指向最后一个链接,跳过所有其他有效链接。

例如 :

1->2->3->4->5

如果我在您的代码之后查找key=4,则列表将如下所示:

1->5

于 2012-12-31T09:46:02.507 回答