// 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大功告成!
沒有留言:
張貼留言