筆試題(單向鏈表的反轉)
單向鏈表的反轉是一個經常被問到的一個面試題,也是一個非;A的問題。比如一個鏈表是這樣的: 1->2->3->4->5 通過反轉后成為5->4->3->2->1。
最容易想到的.方法遍歷一遍鏈表,利用一個輔助指針,存儲遍歷過程中當前指針指向的下一個元素,然后將當前節點元素的指針反轉后,利用已經存儲的指針往后面繼續遍歷。源代碼如下:
1. struct linka {
2. int data;
3. linka* next;
4. };
5. void reverse(linka*& head) {
6. if(head ==NULL)
7. return;
8. linka *pre, *cur, *ne;
9. pre=head;
10. cur=head->next;
11. while(cur)
12. {
13. ne = cur->next;
14. cur->next = pre;
15. pre = cur;
16. cur = ne;
17. }
18. head->next = NULL;
19. head = pre;
20. }
還有一種利用遞歸的方法。這種方法的基本思想是在反轉當前節點之前先調用遞歸函數反轉后續節點。源代碼如下。不過這個方法有一個缺點,就是在反轉后的最后一個結點會形成一個環,所以必須將函數的返回的節點的next域置為NULL。因為要改變head指針,所以我用了引用。算法的源代碼如下:
1. linka* reverse(linka* p,linka*& head)
2. {
3. if(p == NULL || p->next == NULL)
4. {
5. head=p;
6. return p;
7. }
8. else
9. {
10. linka* tmp = reverse(p->next,head);
11. tmp->next = p;
12. return p;
13. }
14. }
【筆試題(單向鏈表的反轉)】相關文章:
C++筆試題:關于鏈表和指針11-22
360筆試題目10-20
華為2017筆試題08-16
2017公共英語一級單向選擇模擬試題08-12
華為2017筆試試題08-10
簡單向上勵志個性簽名10-18
桂林銀行筆試題筆經10-21
ps反轉負沖效果教程介紹11-23
QMS2007筆試審核知識模擬試題11-02
筆試實例:判斷單鏈表中是否存在環11-23