2011-04-27 71 views
0

我有一个包含许多列表元素的双链表。所以我可以使用item.next,item.prev等...(像item.next.prev.prev.next.prev也将工作) 我想交换两个项目,所以首先我需要存储下一个从项目A上一篇:获取指向持久化对象的指针

Item aprev = a.prev; 
Item anext = a.next; 

现在我想换b到A:

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!所以项目循环到他自己的...

我能做些什么,我可以交换这些元素?我需要某种临时项目,但是如何在覆盖它时指向对象的指针消失?

回答

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 _/ 
+0

大拇指......因为我真的不是很明亮;-)认真地说,六个先行词和下一个词在AT ONCE中完全让我感到困惑。 – corlettk 2011-04-27 11:07:55

+0

哇谢谢,不得不试试这个..但最新的问题与我的?是因为我做了两个临时变量吗? – reox 2011-04-27 11:28:50

+1

@reox - 在你的最后一行应该是:'b.prev = aprev; b.next = anext;'。你必须交换next和prev指针 - 不要“交叉交换”。 – 2011-04-27 11:34:17

3
temp = a.prev; 
a.next = b.next; 
a.prev = b; 
b.next = a; 
b.prev = temp; 

会做。