LeetCode 之 JavaScript 解答第206題 —— 反轉鏈表(Reverse Linked List)


Time:2019/4/23
Title: Reverse Linked List
Difficulty: Easy
Author: 小鹿javascript


題目:Reverse Linked List(反轉鏈表)

Reverse a singly linked list.java

Example:git

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

Follow up:github

A linked list can be reversed either iteratively or recursively. Could you implement both?算法

Solve:

▉ 問題分析
1)反轉鏈表的咱們第一可以想到的方法就是最經常使用的方法,聲明三個指針,把頭結點變爲尾結點,而後下一結點拼接到尾結點的頭部,一次類推。說白了就是就是直接將鏈表指針反轉就能夠實現反轉鏈表。
▉ 算法思路

兩種方法:編程

  • 通常反轉
  • 遞歸法

通常解決:性能

1)定義三個指針,分別爲 Pnext、pre、current,current 存儲當前結點, pre 指向反轉好的結點的頭結點,Pnext 存儲下一結點信息。測試

2)判斷當前結點是否能夠反轉(是否爲空鏈表或鏈表大於 1 個結點)?指針

步驟:code

1)Pnext 指針存儲下一結點 。

2)當前結點的 next 結點是否爲 null (爲 null 的話當前結點就是最後的一個結點),若是爲 null,將當前節點賦值爲 head 頭指針(斷裂處)。

3)將 pre 指針指向的結點賦值當前節點 current 的下一結點 next。

4)而後讓 pre 指針指向當前節點 current。

5)current 繼續遍歷, 當前節點指向 current 指向 Pnext。

遞歸法(重點分析):

1)先肯定終止條件:當下一結點爲 null 時,返回當前節點;

2)判斷當前的鏈表是否爲 null;

3)遞歸找到尾結點,將其存儲爲頭結點。

4)此時遞歸的層次是第二層遞歸,因此要設置爲頭結點的下一結點就是當前第二層結點,而且將第二節點的下一結點設置爲 bull。

▉ 測試用例
1)鏈表是空鏈表。

2)當前鏈表的長度小於等於 1。

3)輸入長度大於 1 的鏈表。

▉ 遞歸法
const reverseList = (head)=>{
       if(head == null || head.next == null){
           return head;
       }else{
           let newhead = reverseList(head.next);
           head.next.next = head;
           head.next = null;
           return newhead;
       }
   }
▉ 性能分析
  • 時間複雜度:O(n)。只需遍歷整個鏈表就能夠完成反轉,時間複雜度爲 O(n)。
  • 空間複雜度:O(1)。只須要常量級的空間,空間複雜度爲 O(1)。



歡迎一塊兒加入到 LeetCode 開源 Github 倉庫,能夠向 me 提交您其餘語言的代碼。在倉庫上堅持和小夥伴們一塊兒打卡,共同完善咱們的開源小倉庫!
Github: https://github.com/luxiangqia... 歡迎關注我我的公衆號:「一個不甘平凡的碼農」,記錄了本身一路自學編程的故事。
相關文章
相關標籤/搜索