使用遞迴和非遞迴實現單鏈反轉詳解

來源:互聯網
上載者:User
本篇文章講述了使用遞迴以及非遞迴如何?單鏈反轉,可能有很多同學並不太瞭解單鏈反轉是什麼,那麼就讓我們廢話少說,直接看本篇文章吧!
在題目中給出了可使用遞迴與迭代兩種演算法的提示。
因為對遞迴理解不深刻,首先採用迭代編寫演算法,在題目中的head結點認為是含有資料的第一個結點
題目思路:從頭結點出發,向後遍曆,按照順序一個個逐漸實現結點之間鏈的反轉。
首先嘗試使用2個指標完成操作,失敗

class Solution {public:       ListNode* reverseList(ListNode* head) { ListNode* pre = NULL;  while(head -> next)  { pre = head; head = head -> next; head -> next = pre;   }  return head;};

理由如下:在反轉過程中,head ->next 已經反向,無法繼續向後遍曆,因此增加一個指標採用3個指標完成操作

class Solution {public:       ListNode* reverseList(ListNode* head) { ListNode* pre = NULL;  while(head)  { ListNode* next = head -> next; head -> next = pre;//head是尾結點,指標置空 head = next; pre = head;   }  return pre;           //head = NULL};

遞迴不會,參考Discuss後,理解。
思路如下:通過遞迴使得頭結點不斷向後遍曆,直到終止條件:達到尾結點 後停止。
代碼如下:

class Solution {public:       ListNode* reverseList(ListNode* head) { //終止條件,達到尾結點停止if(head == NULL || head ==NULL)return head;else{//頭結點向後移動ListNode* temp = reverList(head->next);head->next->next = head;   //1head->next = NULL;         //2}return temp;};

到達遞迴終止條件時呈現的狀態如下:




返回上一層遞迴後狀態如下:


經過注釋1、2的兩行代碼後,狀態如下


可見head結點的位置與遞迴層數有關,而temp作為反轉後的頭結點,位置始終不動,從而達到反轉效果。
遞迴代碼雖能看懂,然而我現在還並不會設計,還是個菜雞。

相關文章:

PHP實現單鏈表翻轉操作樣本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.