看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)