1. 程式人生 > 其它 >206.反轉連結串列

206.反轉連結串列

目錄

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; //層層傳遞新的頭節點
}

}