2013-03-30 58 views
1
while(element != null) 
{ 
    //temp = element (useless) 
    element = element.node; 

    //can't do (element.node).method(); 
    //neither temp.method(); 
} 

要遍歷一個LinkedList我們做以上。但是,如果我想回到較早的節點呢?這甚至有可能嗎?我想過將節點存儲在一個臨時變量中,但我無法更改LinkedList中的節點,因爲臨時變量只會存儲節點的值而不是對象。你如何回到較早的節點?

我沒想到的LinkedList是如此困難的工作,因爲我已經習慣與非動態的數據結構(陣列)工作。

+0

您需要給我們更多的上下文。你能否給我們提供'element'類的聲明? – templatetypedef

+0

你需要編寫自己的清單嗎?如果不是,請考慮使用Java集合。 – Marvo

回答

0

有一個相關的數據結構稱爲"Doubly linked list",其中除了存儲一個指向下一個元素,還存儲指向前一個元素。這樣你不僅可以下單,還可以備份。這是否符合你的目的?另外,爲了響應你對使用臨時變量的建議,我認爲只要你存儲的數據是一個對象(而不是一個原語),並且你需要做的改變是更改對象而不是重新分配對象。

+0

你確定嗎?我需要刪除和添加LinkedList中的元素。另外,我想避免使用雙向鏈表。 – user2089523

+0

如果'element'是某個節點對象,並且使用'Node temp = element;(或類似的東西)給它分配一個臨時變量,那麼對'temp'所做的更改也會影響'element'。 –

+0

例外情況是,如果您要使用'Node temp = element; temp = new Node();'在這種情況下,'element'不會是新節點。 –

0

雙向鏈表,吉米·李提到以上,是經典的方法。您還可以保存對「有趣」節點的引用。或者,您可以創建一個新的鏈接列表,鏈接的方向與您遍歷列表相反。最後,一個技巧就是在遍歷列表時簡單地顛倒鏈接,但是這改變了原始列表。

+0

你如何保存參考?就像我不知道。我沒有被教過這樣的方法。 – user2089523

+1

java中的所有內容均通過引用完成。當你在例子'element = element.node'中說,元素現在包含對element.node引用的東西的引用。如果你來自C編程背景,那麼引用是類似於指針的人。 – Marvo