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