206.反轉連結串列
阿新 • • 發佈:2022-03-01
目錄
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
206.翻轉連結串列
題目
給你單鏈表的頭節點 head ,請你反轉連結串列,並返回反轉後的連結串列。
示例 1:
輸入:head = [1,2,3,4,5]
輸出:[5,4,3,2,1]
示例 2:
輸入:head = [1,2]
輸出:[2,1]
示例 3:
輸入:head = []
輸出:[]
提示:
連結串列中節點的數目範圍是 [0, 5000]
-5000 <= Node.val <= 5000
進階:連結串列可以選用迭代或遞迴方式完成反轉。你能否用兩種方法解決這道題?
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/reverse-linked-list
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題解-迭代法
連結串列的交換,需要知道當前節點和他的前一個節點
class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode tmp; while(head!=null){ tmp = head.next; //先把當前元素的後一個元素記錄下來,防止斷鏈 head.next = pre; pre=head; head=tmp; } return pre; } }
題解-遞迴法
遞迴的終止條件
當遍歷到最後一個節點就可以開始返回了
if(head==null||head.next==null)return head;
//head是排除剛進來就為空的情況
遞迴的單層邏輯
根據下圖可以看見,遞迴的返回最後一個節點,也就是翻轉之後的新節點,這個值需要層層傳遞下去
單層遞迴需要做的就是,把當前的節點加在翻轉成功的節點的後面。
class Solution { public ListNode reverseList(ListNode head) { if(head==null||head.next==null)return head; ListNode newHead= reverseList(head.next); head.next.next = head; head.next=null; return newHead; //層層傳遞新的頭節點 } }