我似乎已经完成了这项任务。即使把它拿出来似乎也没有给我一个有效的解决方案。有人可以帮助我找到我的思维过程在这里发生的地方吗?
// 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) ;
为什么会这样?
答案 0 :(得分:1)
这是双重链接列表,是吗?那是什么意思?确保以正确的顺序更新所有相关链接。另外,请确保所有相关节点都存在。
修改强>
让我们按顺序完成你的陈述。
在开始之前,您有prev
,其属性succ
指向后继节点。 (或者是吗?可能有例外吗?如果存在这样的异常,你将如何处理?)prev.succ.pred
应该与prev
相同,前提是prev.succ
指向后继节点。
现在,您的前两个语句设置为ins.pred
和ins.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等,因此是无限循环。