// reverse a link list void reverse_link_list(void) { // we need 3 pointers to keep going node *rush, *prev, *now; // initialize rush = head; now = NULL; // loop from head to final while (rush != NULL) { // prev now rush prev = now; now = rush; rush = rush->next; // prev<-now rush now->next =prev; } // assign head to now head = now; }反轉一個link list我們會需要三個指標。因為如果照以前一樣只用兩個指標來做的話:
while (rush != NULL) { prev = rush; rush = rush->next; rush->next = prev; }我們會永遠沒辦法往下一個node前進,因為現有的now的next已經往前接了,而該往後的node會因此斷了音訊。所以我們需要一個pointer來保存下一個node的位置。因此rush是用來保存下一個node的位置,而now是現有的node,prev則是前一個node。由於我們要反轉一個link list,所以now的next應當接在prev上。
我們初始化指標使得: now(NULL) rush(head)
這樣在進入迴圈做這件事情的時候:
prev = now; now = rush; rush = rush->next; // prev<-now rush now->next =prev;就會讓前頭長成這樣 prev(NULL)<-now(head) rush(next)
這樣子我們就把目前的head接給NULL,也因為我們要反轉的關係,head將來就會成為最後一個節點,而我們知道最後一個節點的next是NULL,因此這樣做是沒問題的,這也是支所以我們把now initialize為NULL的初衷。
與使用兩個指標的方式不同的是,由於我們有保存下一個指標的位址rush,所以我們要往下一個節點邁進的時候,只需要把rush assign給now。然後rush就可以往下一個節點邁進。
接著最後再把head assign給目前的now(而不是rush!因為經過迴圈之後rush已經是NULL了):
head = now大功告成!
沒有留言:
張貼留言