我有一个包含许多列表元素的双链表。所以我可以使用item.next,item.prev等...(如item.next.prev.prev.next.prev也可以) 我想交换两个项目,所以首先我需要存储项目A的下一个和上一个:
Item aprev = a.prev;
Item anext = a.next;
现在我想把b换成:
a.next = b.next;
a.prev = b.prev;
a.next.prev = a;
a.prev.next = a;
现在我需要交换a到b所以我使用以前保存的项目:
b.next = aprev;
b.prev = anext;
...
现在我遇到了问题! aprev是a.prev,现在是b.prev!所以这个项目循环到他自己......
我能做什么,我可以交换这些元素?我需要某种临时项目,但当我覆盖它时指向对象的指针何时消失?
答案 0 :(得分:3)
temp = a.prev;
a.next = b.next;
a.prev = b;
b.next = a;
b.prev = temp;
会做的。
答案 1 :(得分:2)
基本上你将有两个交换操作,一个用于prev指针,一个用于下一个指针:
swapPrevPointer(a,b);
swapNextPointer(a,b);
与
private swapPrevPointer(Item a, Item b) {
Item temp = a.prev;
a.prev = b.prev;
b.prev = temp;
}
private swapNextPointer(Item a, Item b) {
Item temp = a.next;
a.next = b.next;
b.next = temp;
}
视觉解释
初始列表:
null <--ap-- A --an--> B --bn--> C
<--bp--
交换后:
null <--ap-- B --an--> A --bn--> C
<--bp--
必要的更改
B.prev <- ap ____ swapping "prev" pointers
A.prev <- bp _/
B.next <- an ____ swapping "next" pointers
A.next <- bn _/