从双链表中删除-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所以你是说,如果我确切知道要删除哪个节点,那么使用第二个函数会更简洁,如果我只知道节点的值,第一个函数会更有用?