2012-09-06 14 views
0

這是在IBM ISL採訪中提出的。給定一個具有奇數個節點的單鏈表,有兩種方法只通過遍歷列表找到一箇中間節點?

我經歷了這個問題,How to find the middle node of a single linked list in a single traversal (if the length of the list is not given),但它沒有包含我正在尋找的答案,所以再次張貼在這裏。

我有一個單一的鏈表,讓我們說節點數是奇數。告訴我通過遍歷列表找到中間節點的兩種方法嗎?

我回答了,拿2個指針p1 & p2將p2移動2個節點,p1移動1個節點。當p2爲空時,p1在中間節點。

採訪者回答:這是使用2個指針的最簡單方法。告訴我更多的方法。提示:是否有可用的編譯器屬性?

有人可以給我一種方式使用提示嗎?

+2

編譯器屬性?這是C++嗎? –

+5

第一個解決方案聽起來像是遍歷列表的1.5倍。 – Beta

+0

@RandyLevy,是的 – user875036

回答

5
#include <vector> 
#include <list> 

typedef std::list<int> listT; 

listT::const_iterator 
find_middle(const listT &list) 
{ 
    std::vector<listT::const_iterator> v; 
    for (listT::const_iterator i = list.begin() ; i != list.end() ; ++i) 
    v.push_back(i); 

    return v[v.size()/2]; 
} 
+0

這將拋出std :: fit();列表爲空時。我認爲你可以通過在循環之前添加v.push_back(list.begin())來修復它。這將改變什麼是「中間」是一個循環的定義,即使是偶數個元素。 –

+0

...但也很容易修復。留給讀者閱讀。 –

+1

@JiveDadson - 這個問題規定節點的數量是奇數,所以我認爲這是可以假設的。在現實生活中,你是對的,驗證假設會更好 – Nemo

相關問題