2015-10-19 47 views
-1

正如標題所暗示的,我有通過雙向鏈表迭代。唯一的問題是我必須遍歷「n」個元素。如何遍歷C中的雙向鏈表中的n個元素?

例如,如果我給定的列表,1 3 2 2 1 1,I必須遍歷向左或向右根據值我在這樣:

1 - > 3 - > 1 - > 1。我可以移動與列表中的值相同的值。由於我從1開始,我可以向左或向右移動1個元素(只能向右移動)。當我降落在3我可以向左或向右移動3元等

while (temp->next != NULL) { 
    //traverse n elements left or right 
} 

如果我總是剛剛穿越每次1個元素是那麼容易,因爲

temp = temp->next; 

如果有人可以解釋根據節點的值遍歷'n'元素的策略,這將非常感激。

編輯:你只能去的方向,如果有在這個方向足夠的元素。所以在1 - > 3的情況下,你只能在3之後向右。

+0

只是在另一個while循環遍歷一遍.. – Ankur

+0

只是一個細節:在'1的情況下 - > 3 - > ...'爲你展示,你可以去合適的人來'3'。現在你可以左轉或右轉。但是如果你離開了,你會去嗎?還是你停在'1'?另外,對於雙向鏈表,每個節點需要兩個指針:「下一個」和「前一個」。根據當前節點的值,只需循環遍歷連續的「下一個」或「前一個」指針即可。 – lurker

+0

對不起,我應該提到,如果在那個方向上有足夠的元素,你只能朝着方向前進。所以你根本不能離開,因爲沒有足夠的元素。 – Cameron

回答

0

我認爲你的問題是遍歷n元素,其中n是當前節點的值。 的代碼會是這樣〜

int tr; 
while (temp->next != NULL) 
{ 
    tr=temp->data; // temp->data holds the value of the current node. 
    Node *leftptr = temp, *rightptr = temp; 
    while(tr!=0 && rightptr!=NULL) //moves right side 
    { 
      rightptr = rightptr->next; 
      tr--; 
    } 
    tr=temp->data; 
    while(tr!=0 && leftptr!=NULL) //moves left side 
    { 
      leftptr = leftptr->prev; 
      tr--; 
    } 
} 

你可以實現你的算法,並選擇如何遍歷,因爲無論是遊歷的規則。

+1

謝謝,這個基本的例子確實有助於奇蹟! – Cameron

+0

聽起來不錯。祝你有美好的一天! –

+0

如果'temp'是唯一的節點,'tr'將被初始化。 – crashmstr