将中间节点插入双向链表[如何]

时间:2011-03-21 22:00:23

标签: linked-list insertion

我似乎已经完成了这项任务。即使把它拿出来似乎也没有给我一个有效的解决方案。有人可以帮助我找到我的思维过程在这里发生的地方吗?

// 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行和第3行的顺序。 4:

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

通过交换两条线我解决了这个问题。谢谢你的提示!

ADD-ON问题:

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

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

为什么会这样?

1 个答案:

答案 0 :(得分: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;

现在,首先设置为B.所以,第二次调用,使用B:

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

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