※ 引述《killermomo (殺Mo)》之銘言:
: node* reverse(node *phead)
: {
: node *pleft = phead;
: node *pmiddle = pleft->pnext;
: node *pright = pmiddle->pnext;
: while(pright!=NULL)
: {
: pmiddle->pnext = pleft->pnext;
: pleft = pmiddle;
: pmiddle = pright;
: pright = pmiddle->pnext;
: }
: return pmiddle;
: }
先把圖畫出來
pleft pmiddle pright
10 ----> 20 ----> 30 ----> 40 ----> 50
仔細思考就會發現,迴圈裡頭該做的事情是把情況變成下面這樣:
pleft pmiddle pright
10 <---- 20 ----> 30 ----> 40 ----> 50
每一次 loop 的動作就只是讓 pmiddle 指向 pleft,
而 pright 的作用,
是為了讓 pmiddle 在迴圈結束前移到下一個 node 的位址。
所以不難想像,迴圈大概長這樣:
while (....) {
pmiddle.pnext = pleft;
pleft = pmiddle;
pmiddle = pright;
pright = pright.pnext;
}
只要在紙上照著步驟做一遍就會了解了,
你也會知道在這迴圈開始之前和結束之後,
各還有一個步驟我沒有寫出來。
最後是 boundary case,如果整個 list 只有一個 node,
你的程式能正常處理嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.78.231
※ 編輯: tkcn 來自: 140.114.78.231 (05/06 01:40)