學長冷月帶你怒刷LeetCode之反轉鏈表

前言

鏈表的操作是數據結構中最基礎的算法之一,反轉列表也是一道經典的筆試題。很多公司的面試題庫中都有這道題,有的公司明確題目要求不能使用額外的節點存儲空間,有的沒有明確說明,但是如果面試者使用了額外的節點存儲空間做中轉,會得到一個比較低的分數。本題選自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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章