Time:2019/4/23
Title: Reverse Linked List
Difficulty: Easy
Author: 小鹿javascript
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?算法
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)。