??前面的話??
大家好!博主開辟了一個新的專欄——劍指offer,我要開始刷題了!這個專欄會介紹《劍指offer》書上所有的面試編程題,并且會分享一些我的刷題心得,由于博主水平有限,如有錯誤,歡迎指正,如果有更好的解題思路和演算法可以分享給博主哦!一起加油!一起努力!
📒博客主頁:未見花聞的博客主頁
🎉歡迎關注🔎點贊👍收藏??留言📝
📌本文由未見花聞原創,CSDN首發!
📆首發時間:🌴2021年9月2日🌴
??堅持和努力一定能換來詩與遠方!
💭參考書籍:📚《劍指offer第1版》,📚《劍指offer第2版》
💬參考在線編程網站:🌐牛客網🌐力扣
🙏作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
博主的碼云gitee,平常博主寫的程式代碼都在里面,
📌導航小助手📌
- ??劍指 Offer 24. 反轉鏈表??
- 🔐題目詳情
- 💡解題思路
- 🔑源代碼
- 🌱總結
??劍指 Offer 24. 反轉鏈表??
🔐題目詳情
定義一個函式,輸入一個鏈表的頭節點,反轉該鏈表并輸出反轉后鏈表的頭節點,
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
限制:
0 <= 節點個數 <= 5000
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/
💡解題思路
方法1: 雙指標迭代法,
假設反轉物件節點為cur,反轉指向的結點為tail,反轉后tail指向的結點為首結點,具體程序如下圖:


時間復雜度: O(N)
方法2: 遞回法,
簡單來說就是先遞進至最后一個結點,使最后一個結點為反轉鏈表的頭結點,然后在歸出的程序中是后面的結點指向前面的結點,前面的結點指向空,最終實作鏈表反轉,
時間復雜度: O(N)
🔑源代碼
編程語言:C語言
在線編程平臺:力扣
//方法1
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if (head == NULL)
return NULL;
struct ListNode* cur = head;//反轉物件節點,初始化第1個結點
struct ListNode* next = NULL;//儲存cur下一個結點
struct ListNode* tail = NULL;//cur前插物件節點,反轉后為反轉鏈表的首結點
while (cur)
{
next = cur->next;
cur->next = tail;//進行前插
tail = cur;
cur = next;
}
return tail;
}
//方法2
struct ListNode* reverseList(struct ListNode* head){
/* 特判 */
if (head == NULL || head->next == NULL) {
return head;
}
//長度為n的鏈表,從最后一個結點開始需要進行n-1次反轉操作
//從第一個結點到最后一個結點,會進入n次reverseList()函式,除去最后一次結點只會回傳最后一個結點外,其他都會進行鏈表結點反轉
//首先遞進至最后一個結點,并保存這個結點作為反轉鏈表后的頭結點
struct ListNode *next = head->next;
struct ListNode *node = reverseList(next);
/* 歸出程序中,每一次將結點反轉 */
next->next = head;
/* 被指向的結點指向空 */
head->next = NULL;
return node;
}
🌱總結
對于鏈表的反轉可以使用頭插法或者遞回實作,當然也可以根據堆疊先進后出的特點,使用堆疊反轉鏈表,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297292.html
標籤:其他
