前言
鏈表的操作是數據結構中最基礎的算法之一,反轉列表也是一道經典的筆試題。很多公司的面試題庫中都有這道題,有的公司明確題目要求不能使用額外的節點存儲空間,有的沒有明確說明,但是如果面試者使用了額外的節點存儲空間做中轉,會得到一個比較低的分數。本題選自leetcode的206題,感興趣的小夥伴可以去練習一下。206.反轉鏈表
題目描述
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
冷月題解
因爲是操作單鏈表,而單鏈表是單向指向的,如果要求空間複雜度爲O(1)的情況下,我們只能使用迭代是方式。需要新增加兩個指針。冷月把完整實例代碼放在博客上了,大家可以進入查看學長冷月帶你怒刷LeetCode之反轉鏈表
struct ListNode * cur = head; //指向當前節點
struct ListNode * pre = NULL; //指向上一個節點
一開始,我們鏈表是如下的形式:
此時head不爲空,我們進入第一次循環。
head = head -> next; //指向下一個結點
cur->next = pre; //當前節點 指向 上一個節點
如下圖所示:
這時,我們已經將第一個節點指向了pre,也就是說將第一個節點反轉了過來,下一步我們要將pre和cur移動一下位置,方便下一次循環。
pre = cur; //指針域往後挪動
cur = head; //指針域往後挪動
如下圖所示:
這時已經完成了第一次循環的所有步驟,我們成功將第一個節點反轉,並且從第二個節點開始成爲了新的表頭,大家可以與第一張圖片對比一下,是不是很相似呢?然後進入第二次循環,循環的步驟方法和第一次的一模一樣,第二次循環完後的圖示如下:
再經過四次循環後,cur = head = NULL,將會跳出循環,我們只需要將pre 返回出去即可,獲得反轉後的鏈表。圖示如下:
完整代碼如下:
/**
公衆號:學長冷月
**/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode * cur = head; //指向當前節點
struct ListNode * pre = NULL; //指向上一個節點
while(head){ //如果鏈表不爲空則進入循環
head = head -> next; //指向下一個結點
cur->next = pre; //當前節點 指向 上一個節點
pre = cur; //指針域往後挪動
cur = head; //指針域往後挪動
}
return pre;
}
總結一下
這道反轉鏈表的題屬於很基礎的入門題,是每位小夥伴都應該掌握的難度。光說不練假把式,大家要先理解,然後將代碼自己實現一下才能將知識轉變成自己的。冷月會在博客上首發《怒刷LeetCode》系列文章,感興趣的小夥伴可以給冷月的博客加一個收藏冷月的博客,方便獲取最新的推送~
如果這篇博文有幫助到您,可以幫冷月點一個贊或者加一個關注哦!
歡迎關注我的公衆號:學長冷月,免費獲得獨家整理的學習資源和日常乾貨推送。
如果您對我的專題內容感興趣,也可以關注我的博客:www.guoyu7.com