Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从双链表中删除-java_Java_Nodes_Doubly Linked List - Fatal编程技术网

从双链表中删除-java

从双链表中删除-java,java,nodes,doubly-linked-list,Java,Nodes,Doubly Linked List,我试图更好地理解老师关于如何从双链接列表中删除节点的注释,她在黑板上的内容是 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. } 我忍不

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

 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);
}
public void deletemidle(){
节点电流=头;
int i=0;
而(i
正确的方法是要么传入值,即
数据,要么将方法设置为私有,以防止误用

或者两者都做:

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

正确的方法是要么传入值,即
数据
,要么将方法设置为私有,以防止误用

或者两者都做:

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的第一个函数取一个值,遍历链表以查找节点,并删除节点。第二个函数获取一个节点并简单地删除它,而不进行迭代。因此,第一个函数的复杂度是O(N),第二个函数的复杂度是O(1)。然而,我不一定同意他的断言,即“正确”的方法是将函数私有化。我会说这取决于用例。太棒了,谢谢你!我不知道为什么我很难可视化链表结构,它似乎是我唯一挣扎的数据结构,但这澄清了它you@Andreas但是针对我的最后一个问题,如果我想删除中间节点(在我的测试中把这个问题弄错了,从那以后就没有时间见她了)我会做一些类似于我在原始帖子中所做的事情吗?@MFisherKDX所以你是说,如果我确切知道要删除哪个节点,使用第二个函数会更简洁,如果我只知道节点的值,那么第一个函数就更有用了?我想为OP指出,Andreas的第一个函数取一个值,遍历列表找到节点,并删除节点。第二个函数获取一个节点并简单地删除它,而不进行迭代。因此,第一个函数的复杂度是O(N),第二个函数的复杂度是O(1)。然而,我不一定同意他的断言,即“正确”的方法是将函数私有化。我会说这取决于用例。太棒了,谢谢你!我不知道为什么我很难可视化链表结构,它似乎是我唯一挣扎的数据结构,但这澄清了它you@Andreas但是针对我的最后一个问题,如果我想删除中间节点(在我的测试中把这个问题弄错了,从那以后就没有时间见她了)我会做一些类似于我在原始帖子中所做的事情吗?@MFisherKDX所以你是说,如果我确切知道要删除哪个节点,那么使用第二个函数会更简洁,如果我只知道节点的值,第一个函数会更有用?