使用密钥从链接列表中删除节点

时间:2012-12-31 09:25:20

标签: java linked-list nodes

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

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

提前致谢!

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您的代码存在一些问题。实际工作的唯一情况是删除列表的第一个元素。

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

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

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

    }

此代码将像我修正了我的代码一样魅力!感谢上帝