java - DoublyLinkedList 节点操作未按预期工作,为 .prev 函数提供了错误的节点数据

标签 java nodes doubly-linked-list

我目前正在为我的 DLList 程序编写 deleteAt() 函数,尽管为了尝试删除堆栈中间的一个节点,代码的行为不可预测,我不知道为什么?

对于先前创建的包含数字的列表: 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 < count) {
    if (i == pos) {
        DLLNode tmp = posFind.next;
        posFind.next = current;
        current.prev = head;  
        current.next = tmp;
        tmp.prev = current;
    }
    posFind = posFind.next;
    i++;
}

最佳答案

找到威利了!

错误在insertBefore。 你有

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

但是标线应该是

current.prev = posFind;

将反向指针设置为 head 会弄乱每个非结束插入。

关于java - DoublyLinkedList 节点操作未按预期工作,为 .prev 函数提供了错误的节点数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33395158/

相关文章:

java - 迭代并添加到字符串

java - 使用java删除链表中的节点

PHP 节点不通过引用传递

c - 从尾到头反转双向链表

c++ - DoublyLinkedList 方法调用错误

java - Android:ListView 中每行的动态复选框数

Java TCP 打洞

Java进程在运行时打印输出

mysql - Node js 调用 mysql 存储过程对我不起作用,破坏了我的代码

java - 有没有一种方法可以让它在恒定时间而不是线性时间内轻松运行?