【问题标题】:deleting from doubly linked list - java从双向链表中删除 - java
【发布时间】:2018-09-16 22:10:15
【问题描述】:

我试图更好地理解我的老师关于如何从双向链表中删除节点的笔记,她在板上的内容是

 public void deleteNode(Node D){
 Node current = head;
 while(current.data != D.data && current.next != null){
  current = current.next;
   }
  d.prev.next = d.next;
  d.next.prev = current.prev.
 }

我不禁觉得这不足以删除一个节点。我在想也许她的意思是

current.prev.next = d.next and
current.next.prev = d.prev

一旦我弄清楚如何更好地理解这一点,如果我想通过这样做从中间删除一个节点是否有意义

public void deleteMiddle(){
    Node current = head;
    int i = 0;
    while(i < size/2){
        current = current.next;
        i++;
    }
    deleteNode(current);
}

【问题讨论】:

  • 从双向链表中删除节点可以在O(1)中完成。根本不需要迭代。这是双向链表相对于单链表的巨大优势之一。

标签: java nodes doubly-linked-list


【解决方案1】:

正确的方法是传入值,即data,或者将方法设为私有,以防止误用。

或者两者都做:

public void deleteNode(int data) {
    Node current = head;
    while (current != null && current.data != data) {
        current = current.next;
    }
    deleteNode(current);
    // Note: We silently do nothing if 'data' not found
}
private void deleteNode(Node node) {
    if (node != null) {
        // Here we can rely on 'node' actually being in our list
        if (node.prev != null)
            node.prev.next = node.next;
        else
            head = node.next;
        if (node.next != null)
            node.next.prev = node.prev;
        else
            tail = node.prev;
    }
}

【讨论】:

  • 我想为 OP 指出,Andreas 的第一个函数采用 value 遍历列表以查找节点,并删除该节点。第二个函数接受一个 node 并简单地删除它而不进行迭代。因此,第一个函数的复杂度为 O(N),第二个函数的复杂度为 O(1)。
  • 但是,我并不一定同意他的断言,即“正确”的方法是将函数设为私有。我会说这取决于用例。
  • 太棒了,谢谢!我不知道为什么我很难可视化链接列表结构,这似乎是我唯一遇到的数据结构,但这清除了谢谢
  • @Andreas 但是针对我的最后一个问题,如果我只想删除中间节点(在我的测试中弄错了这个问题,从那以后没有时间见到她)我会做类似的事情吗我在原始帖子中做了什么?
  • @MFisherKDX 所以你说如果我知道我想删除哪个节点,使用第二个函数会更简洁,而第一个函数更适合我只知道的值节点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多