鏈表--鏈表中相鄰元素兩兩交換(leetcode24


遞歸解法

遞歸寫法要觀察本級遞歸的解決過程,形成抽象模型,因為遞歸本質就是不斷重復相同的事情。而不是去思考完整的調用棧,一級又一級,無從下手,應該關注一級調用小單元的情況,也就是單個f(x)。

其中我們應該關心的主要有三點:

  • 返回值

  • 調用單元做了什么

  • 終止條件

要注意終止條件:head為空(沒有結點了)或者head.next為空(只剩一個結點了,不用再換了)

head是函數傳進來的參數,head隨着遞歸的過程中,每次傳進來的都是不一樣的。(是second.next

代碼如下:

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null||head.next == null){
            return head;
        }

        ListNode first = head;
        ListNode second = head.next;

        first.next = swapPairs(second.next);
        second.next = first;

        return second;
    }
}

時間復雜度:O(N),其中 N 指的是鏈表的節點數量。
空間復雜度:O(N),遞歸過程使用的堆棧空間。


迭代

這是第三次用到啞結點了,啞結點真的會省去很多判斷

至於為什么prev=first,這個要仔細看題目描述,21已經換過一次了,13不用再換了,直接換34

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;

        ListNode prev = dummy;
        while (head != null && head.next != null){
            ListNode first = head;
            ListNode second = head.next;

            prev.next = second;
            first.next = second.next;
            second.next = first;
            
            prev = first;
            head = first.next;

        }

        return dummy.next;
    }
}

時間復雜度:O(N),其中 N 指的是鏈表的節點數量。
空間復雜度:O(1)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM