1. 程式人生 > >LeetCode 206:反轉連結串列 Reverse Linked List

LeetCode 206:反轉連結串列 Reverse Linked List

反轉一個單鏈表。

Reverse a singly linked list.

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

進階: 你可以迭代或遞迴地反轉連結串列。你能否用兩種方法解決這道題?

Follow up:

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

解題思路:

每次遍歷到最後一位取節點這種方法就算了時間複雜度太高。如題目進階要求的兩種方法,迭代和遞迴:

迭代:

每次分出來一個節點把節點作為頭節點新增到新連結串列上:

原連結串列:1->2->3->4->5

分離第一個節點作為頭節點新增到新連結串列:1 原連結串列:2->3->4->5

分離下一個節點作為頭節點新增到新連結串列:2->1 原連結串列:3->4->5

分離下一個節點作為頭節點新增到新連結串列:3->2->1 原連結串列:4->5

分離下一個節點作為頭節點新增到新連結串列:4->3->2->1 原連結串列:5

分離下一個節點作為頭節點新增到新連結串列:5->4->3->2->1 原連結串列:null

Java:

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode pre = null;
        ListNode tmp = null;
        while (head != null) {
            tmp = head.next;//tmp暫存當前節點的下一個節點
            head.next = pre;//當前節點下一個指向pre
            pre = head;//重新整理pre
            head = tmp;//重新整理當前節點為tmp
        }
        return pre;
    }
}

Python3:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        pre,tmp=None,None
        while(head):
            tmp=head.next
            head.next=pre
            pre=head
            head=tmp
        return pre

遞迴:

其實就是用遞迴完成棧的功能:先進後出

基線條件為遇到空節點(到連結串列末尾),返回物件為連結串列的最後一個節點,在遞迴函式中傳遞一直不變。從連結串列末尾向頭部逐個分離節點,並將節點新增到新連結串列的末尾。與迭代法原理相似。

原連結串列:1->2->3->4->5

遞迴到最後一層時遇到null節點返回尾節點5

回到上一層遞迴 分離節點 5 作為新連結串列的尾節點:5,置空原本5節點,原連結串列1->2->3->4->null

回到上一層遞迴 分離節點 4 作為新連結串列的尾節點:5->4,置空原本4節點,原連結串列1->2->3->null

回到上一層遞迴 分離節點 3 作為新連結串列的尾節點:5->4->3,置空原本3節點,原連結串列1->2->null

回到上一層遞迴 分離節點 2 作為新連結串列的尾節點:5->4->3->2,置空原本2節點,原連結串列1->null

回到上一層遞迴 分離節點 1 作為新連結串列的尾節點:5->4->3->2->1,置空原本1節點,原連結串列null

Java:

class Solution {
    public ListNode reverseList(ListNode head) {
        //基線條件
        if (head == null || head.next == null) return head;
        //遞迴
        ListNode tmp = head.next;//暫存頭節點的下一個節點
        ListNode pre = reverseList(head.next);//遞迴呼叫該函式,pre為返回的新連結串列的頭節點,原連結串列的最後一個節點,無論遞迴多少層該返回值一直傳遞不變
        tmp.next = head;//暫存的下一個節點指向傳入節點
        head.next = null;//下一個節點即原本指向tmp的節點 置空
        return pre;
    }
}

Python3:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        tmp = head.next
        pre = self.reverseList(head.next)
        tmp.next = head
        head.next = None
        return pre

歡迎關注公.眾號一起刷題:愛寫Bug