Java DoublyLinkedList节点操作未按预期工作,为.prev函数提供了错误的节点数据 我目前正在为DLLIST程序编写DeleTeT()函数,虽然试图删除堆栈中间的一个节点,但代码不可预测,我不知道为什么?

Java DoublyLinkedList节点操作未按预期工作,为.prev函数提供了错误的节点数据 我目前正在为DLLIST程序编写DeleTeT()函数,虽然试图删除堆栈中间的一个节点,但代码不可预测,我不知道为什么?,java,nodes,doubly-linked-list,Java,Nodes,Doubly Linked List,对于先前创建的包含编号的列表: 2,3,9,8,7,4 以及删除节点位置2(编号9)处数据的操作 我的代码表现得很奇怪,它不是简单地删除位置2的数据,而是删除位置2和1的数据,因此结果是:2,8,7,4 使用diplayNode()函数时,我发现代码行DLLNode p=posFind.prev;在那个特定的迭代中,它没有给我posFind之前的节点的数据,而是总是给我数据,好像 posFind==head.next, 因此,它总是返回“head”的数据 我不知道为什么会发生这种情况,因为当我在

对于先前创建的包含编号的列表: 2,3,9,8,7,4

以及删除节点位置2(编号9)处数据的操作

我的代码表现得很奇怪,它不是简单地删除位置2的数据,而是删除位置2和1的数据,因此结果是:2,8,7,4

使用diplayNode()函数时,我发现代码行DLLNode p=posFind.prev;在那个特定的迭代中,它没有给我posFind之前的节点的数据,而是总是给我数据,好像 posFind==head.next, 因此,它总是返回“head”的数据

我不知道为什么会发生这种情况,因为当我在嵌套的if()语句中使用displayNode()函数时,它会在特定的迭代中为posFind返回正确的数据

你知道为什么会这样吗

代码:

while(i
代码中有几个小错误。原则上,解决方案可归结为以下几点:

public void deleteAt(int pos) {
    if (0 > pos || pos >= count) {
        return false;
    }
    DLLNode node = nodeAt(pos);
    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;
    }
    --count;
    return true;
}

private DLLNode nodeAt(int pos) {
    if (0 > pos || pos >= count) {
        throw new IndexOutOfBoundsException();
    }
    DLLNode node;
    if (pos <= count/2) {
        node = head;
        for (int i = 0; i < pos; ++i) {
            node = node.next;
        }
    } else {
        ...
    }
    return node;
}

代码中有几个小错误。原则上,解决方案可归结为以下几点:

public void deleteAt(int pos) {
    if (0 > pos || pos >= count) {
        return false;
    }
    DLLNode node = nodeAt(pos);
    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;
    }
    --count;
    return true;
}

private DLLNode nodeAt(int pos) {
    if (0 > pos || pos >= count) {
        throw new IndexOutOfBoundsException();
    }
    DLLNode node;
    if (pos <= count/2) {
        node = head;
        for (int i = 0; i < pos; ++i) {
            node = node.next;
        }
    } else {
        ...
    }
    return node;
}
找到沃尔多了

错误出现在
插入之前的
。
你有

while (i < count) {
    if (i == pos) {
        DLLNode tmp = posFind.next;
        posFind.next = current;
        current.prev = head;  <----- here!!!
        current.next = tmp;
        tmp.prev = current;
    }
    posFind = posFind.next;
    i++;
}
将反向指针设置为head时,每插入一个not end insert都会出错。

找到了Waldo

错误出现在
插入之前的
。
你有

while (i < count) {
    if (i == pos) {
        DLLNode tmp = posFind.next;
        posFind.next = current;
        current.prev = head;  <----- here!!!
        current.next = tmp;
        tmp.prev = current;
    }
    posFind = posFind.next;
    i++;
}

将后向指针设置为每插入一个未结束的头。更奇怪的仍然是n=posFind.next;正在按预期工作并返回正确的数据,这令人难以置信地困惑……请告诉我这些假设是否正确:1)
head
是列表中的第一个节点(索引0)。2)
pos
是要删除的索引(示例中的索引2)。3)
posFind
表示将被删除的节点。4) 您发布的代码是删除方法的全部。1)正确:Head是列表中的第一个节点(索引0)2)正确:pos是要删除的索引3)正确:posFind在if()中语句表示将被删除的节点4)No:这只是删除栈中间节点的代码。我将把完整代码添加到主件中,请向我们展示构建列表的代码。(添加方法和对该方法的调用)。不,您不能从此站点删除分配的证据。更奇怪的是n=posFind.next;正在按预期工作并返回正确的数据,这令人难以置信地困惑……请告诉我这些假设是否正确:1)
head
是列表中的第一个节点(索引0)。2)
pos
是要删除的索引(示例中的索引2)。3)
posFind
表示将被删除的节点。4) 您发布的代码是删除方法的全部。1)正确:Head是列表中的第一个节点(索引0)2)正确:pos是要删除的索引3)正确:posFind在if()中语句表示将被删除的节点4)No:这只是删除栈中间节点的代码。我将把完整代码添加到主件中,请向我们展示构建列表的代码。(添加方法和对该方法的调用)。不,您无法从此站点删除分配的证据。实现此操作似乎会删除堆栈的所有元素?我可能会出错,但我的第一个猜测是数据结构已损坏。物理结构的转储将对您有所帮助。我添加了类不变量,对于有限数量的测试用例,它甚至比单元测试更严格。实现它似乎会删除堆栈中的所有元素?我可能会出错,但我的第一个猜测是数据结构已损坏。物理结构的转储将对您有所帮助。我添加了类不变量,对于有限数量的测试用例,它甚至比单元测试更严格。
current.prev = posFind;