【问题标题】:deleting a node from a linked list based on a key根据键从链表中删除节点
【发布时间】:2015-04-28 06:27:33
【问题描述】:

您好,我正在尝试根据密钥删除节点。我正在学习字典实现,并决定从头开始实现它以充分理解这个概念。我成功地能够使用 2 个节点引用头尾指针来添加和返回值。但是我很难使用密钥从列表中删除一个节点。 以下是我要从列表中删除的代码

public V remove(K key) {
   V result = null;
   if(!this.isEmpty()&&head==tail){ //if head and tail are only nodes in the list
       if(tail.getKey().equals(key)){
       result = tail.getValue();
       head=null;
       tail = null;
       count--; //decrements the count in the list
       }
   }
   else {
        boolean found = false;
        Node current = head;
        Node previous = null;
        while(current!=null&&!found){
            if(current.getKey().equals(key)){
                previous = current;
                result = current.getValue();
                previous.setNextNode(current.getNextNode());
                previous.setNextNode(null);
                count--;
                found = true;
            }
            current = current.getNextNode();
        }
       }
   return result;
   }

当我输入要删除的所需密钥时。它会删除要删除的所需键之后的所有键。 PS这不是一个双链表。我刚刚创建了一个尾节点来访问列表中的最后一个节点

【问题讨论】:

  • 你遇到了什么问题?
  • @nitegazer2003 当我输入要删除的密钥时,它会删除所需密钥之后的所有密钥。
  • 你的逻辑错了。
  • @TimBiegeleisen 我同意逻辑有问题,但我在纸上画了出来并遍历了节点。问题是当我找到要删除的节点时,我必须将当前节点的下一个节点分配给它的前一个节点。这就是我遇到问题的地方
  • 你为什么打电话给previous.setNextNode(null);

标签: java dictionary linked-list


【解决方案1】:

您似乎陷入了更新列表的困境。此代码简化了您的算法:

// this method returns the head of the new list with the item possibly removed
public Node remove (K key) {
V result = null;
if (this.isEmpty()) {
    return null;                          // return null for empty list
} else if (head.getKey().equals(key)) {
    return head.getNextNode();            // return head if head matches
} else {
   Node current = head;
   Node next = head.getNextNode();

   while (next != null) {                 // walk down the list and search
       if (next.getKey().equals(key)) {
           current.setNextNode(next.getNextNode());
           break;
       }
       current = next;                    // advance list pointers
       next = next.getNextNode();
    }

    return head;                          // will return head for list with 1 element
    }
}

【讨论】:

  • 你帮了很多忙。您的代码在我尝试时有效。另外,我不得不担心头部和尾部节点,而这似乎可以解决它。将它画在纸上并遍历列表。谢谢。
  • 我的概念并不遥远,但除了我知道是错误的设置 previous.setNextNode(null) 你能指出什么是根本错误的吗?非常感谢您的帮助
  • 据我所知,您没有正确更新指针。我花了很多时间处理所有基本情况(1 个节点、0 个节点等),以达到我有一个指向头部的 current 指针和指向下一个节点的 next 指针的地步。之后,我就沿着列表往下走,可能会找到要删除的节点。
  • 非常感谢,我在纸上画出了节点,是的,您正在处理所有案例。我很感激,因为我在纸上画了出来,是的,你是对的,我没有正确更新指针。非常感谢
【解决方案2】:

您得到了大致的想法,除了两件事:previous = current 应该在 if 块之外完成,以便它总是在向前移动电流之前被分配,并且应该删除 previous.setNextNode(null),因为它撤消了前一行。

此外,当列表中的第一个节点与键匹配时,您需要进行特殊情况,以便您可以重新分配头部。

while(current!=null&&!found){
    if(current.getKey().equals(key)){
        result = current.getValue();
        previous.setNextNode(current.getNextNode());
        count--;
        found = true;
    }
    previous = current;
    current = current.getNextNode();
}

【讨论】:

  • 是的,这似乎可行,但我现在必须担心第一个和最后一个节点
【解决方案3】:

你有两个错误:

  1. 您将previous = current; 设置为第一条语句,这意味着previous 和current 总是相同的。
  2. 您应该删除此行: previous.setNextNode(null); 在分配新的下一个节点后立即执行此操作。

【讨论】:

  • 是的,我把它注释掉了,但它不会删除节点
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 2017-02-10
  • 2013-01-08
  • 2017-10-21
  • 2013-08-30
  • 2020-02-04
相关资源
最近更新 更多