2011-04-27 75 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; 

會做。