从链接列表中删除节点

时间:2012-12-30 14:52:48

标签: java linked-list

我正在尝试从链接列表中删除节点!我的链表中存储了以下数据。

aa 1 1 1 1
bb 2 2 2 2
cc 3 3 3 3

我正在使用Java代码而我的代码是

Node p=first;

for(Node c=first;c!=null;c=c.next){

    if(c.data.startsWith(key)){
       if(c.next==null){

       }
       else{
           p=c;
       }

       if(c==first){
           first=first.next;
       }
       else{
           p.next=c.next;
       }
    }
}

我遇到的问题是此代码只能正确删除数据,即cc 3 3 3 3。我想知道我的代码中的问题是什么,以便我能够删除我想要删除的数据! 提前谢谢。

3 个答案:

答案 0 :(得分:1)

你需要这个作为循环的最后一行:

p = c;

您还需要取消c.next == null的测试。找到密钥后删除节点无关紧要。

整个循环应该是:

for(Node c = first, p = null; c != null; p = c, c = c.next){

    if (c.data.startsWith(key)) {
       if (p == null) {
           first = c.next;
       } else {
           p.next = c.next;
       }
       break;
    }
    p = c;
}

答案 1 :(得分:0)

你不应该需要这段代码:

  if(c==first){
       first=first.next;
   }
   else{
       p.next=c.next;
   }

您的循环已经移动到下一个节点。此代码只会导致您跳过其他每个节点。也许这就是你找不到钥匙的原因。

答案 2 :(得分:0)

试试这样:

Node lastNode = null;

// Traverse all nodes in the list
for (Node node = first; node != null; node = node.next) {

    // Check for node to delete
    if (node.data.startsWith(key)) {
       if (lastNode != null) {
           // directly link last node with next node to remove node
           lastNode.next = node.next;
       } else {
           // if the node to delete is the first node, update first node
           first = node.next;
       }
       // remember last node
       lastNode = node;
    }
}