遍歷鍊錶時跳出迴圈的依據

2021-10-07 04:52:32 字數 1006 閱讀 7402

解決鍊錶相關的演算法題時,在迴圈的判斷語句中,選擇pnode==nullptr 與 pnode->next==nullptr的問題上舉棋不定,處理起來很不順心。

所以,記錄下 選擇pnode==nullptr 還是 pnode->next==nullptr 的依據

下面以一道演算法題展開講解,題目為 從尾到頭列印鍊錶

鍊錶節點定義如下:

struct listnode

思路為:從頭到尾遍歷每乙個節點,將每乙個節點壓入棧中,然後,依次列印棧頂、彈出棧頂元素,直到棧為空。

這裡就涉及到遍歷每乙個節點,在迴圈的判斷語句中 選擇pnode==nullptr 還是 pnode->next==nullptr 的問題就來了

選擇依據其實很簡單,就是最後的pnode節點是否需要在迴圈體中被處理

在本例子中,利用迴圈體處理壓棧操作,顯然,最後乙個節點是需要被壓棧處理的,所以選擇pnode==nullptr

實現**如下:

void printlistreversingly_iteratively(listnode * phead)

while(!nodes.empty())

}

再舉例,如何獲取指向鍊錶最後乙個節點的指標?

顯然也是利用迴圈體,在迴圈體中切換到下一節點,我們不想到最後乙個節點時還切換到下乙個節點,所以pnode->next==nullptr

listnode * pnode = phead;

while(pnode->next==nullptr)

這樣,在退出迴圈體後,pnode指向鍊錶的最後乙個節點

結論:

在遍歷鍊錶時,若最後乙個節點需要在迴圈體中被處理,選擇pnode==nullptr 

若最後乙個節點不需要在迴圈體中被處理,選擇pnode->next==nullptr

而無論選擇哪一種,由於是遍歷,迴圈體中都是採用pnode = pnode->m_pnext;

雙向迴圈鍊錶(建立 插入 刪除 遍歷)

author chen ming dong include include typedef struct list str int n str creat str head head prior p p next head return head 遍歷 void gothrough str head...

雙層迴圈遍歷鍊錶刪除重複元素

1.刪除鍊錶中的重複元素,要求是不能夠使用緩衝區 由於題目要求了不能夠使用額外的空間來進行輔助我們找出重複的元素,即不能夠使用額外的資料結構來儲存元素,所以我們不能夠使用雜湊表 hashset 來輔助我們找出重複的元素了,但是我們可以普遍的做法 使用雙重迴圈來找出重複的元素 在鍊錶中一般是使用whi...

單向鍊錶的遍歷

鍊錶的遍歷和陣列類似,就是跑鍊錶 輸出單向鍊錶尾結點的值 include include define n 5 typedef struct nodeelemsn elemsn creatlink int a return h elemsn printlink elemsn h return p i...