【问题标题】:inserting intermediary node into doubly-linked list [how to]将中间节点插入双向链表[如何]
【发布时间】:2011-07-20 01:10:46
【问题描述】:

我似乎在完成这项任务。即使把它画出来似乎也没有给我一个可行的解决方案。有人可以帮我找出我的思维过程在哪里崩溃吗?

// method receives node ins to be inserted
// and node prev in front of which ins should be inserted
public void insertIntermediate(DLLNode ins, DLLNode prev)
{
    ins.pred = prev ; // update node ins' predecessor information
    ins.succ = prev.succ ; // update node ins' successor information 
    prev.succ = ins ; // update list's information
    prev.succ.pred = ins ; // update list's information
}

[EDIT2](删除了 edit1 以减少混乱)

@Andrew,好的,我找到了:上面的错误是第 3 行和第 4 行的顺序:

第 3 行导致我无法访问 prev.succ.pred。

通过交换这两行,我解决了这个问题。感谢您的提示!

附加问题:

我遇到了另一个奇怪的问题,这就是为什么我浪费了这么多时间来寻找解决方案:如果我再次重新插入一个已经存在的元素,由于某种原因,当我打印时整个事情进入一个无限循环它...例如

myList.addBeforeFirst(B) ;
myList.addBeforeFirst(B) ;

导致循环,而:

myList.addBeforeFirst(B) ;
myList.addBeforeFirst(C) ;

工作正常

方法如下:

public void addBeforeFirst(DLLNode ins)
{
    ins.succ = first ;
    ins.succ.pred = ins ;
    first = ins ;
}

和节点:

DLLNode B = new DLLNode("Hi", null, null) ;
DLLNode C = new DLLNode("Salut", null, null) ;

为什么会这样?

【问题讨论】:

    标签: linked-list insertion


    【解决方案1】:

    这是一个双重-链表,是吗?那是什么意思?确保您以正确的顺序更新所有相关链接。另外,请确保所有相关节点都存在。

    编辑:

    让我们按顺序检查您的陈述。

    在开始之前,您有prev,其属性succ 指向后继节点。 (或者是吗?会有例外吗?如果存在这种例外,您将如何处理?)prev.succ.pred 应该与prev 相同,前提是prev.succ 指向后继节点。

    现在,您的前两个语句设置为 ins.predins.succ。这基本上是正确的想法,但请参阅我上面的问题。

    现在,您将 prev.succ 设置为 ins。专注于这个声明。你现在有丢失的信息吗?那么下面的语句究竟做了什么?是你想要的吗?

    我认为这是在不完全放弃解决方案的情况下我能做的最好的事情。

    编辑无限循环问题:

    您遇到的问题是按值传递参数和按引用传递参数之间的区别。因为您是通过引用传递的,所以您将对同一对象 (B) 的引用传递了两次。这意味着你最终做了以下事情:

    第一次通话:

    B.succ = first;
    B.succ.pred = B; /* why not just first.pred = ins? */
    first = B;
    

    现在,first 设置为 B。所以,第二次调用,使用 B:

    B.succ = B;
    B.succ.pred = B; /* so, now B is its own pred and succ */
    first = B; /* no change here */
    

    所以,现在,first 是 B,first.succ 是 B,first.succ.succ 是 B,等等,因此是无限循环。

    【讨论】:

    • 对我来说,我似乎涵盖了所有四个链接:prev 和 ins 之间的 2 个(前进和后退)和 ins 和 prev.succ 之间的 2 个(前进和后退),所以不确定缺少什么?
    • @Baba 我会编辑我的答案,因为这可能会让评论有点冗长。
    • @Baba 前提是,正如你所说,有一个后继节点,这看起来更好。但是,如果您愿意,您可以在不为后继者创建局部变量的情况下执行此操作,只需更改您所做的分配的顺序即可。这是否值得探索是读者的练习......
    • 您好安德鲁,感谢您的提示!请查看我的编辑,因为我在使用另一个较小的功能的过程中遇到了一些“奇怪”
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多