1. 題目
給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。
示例 1:
輸入:head = [1,2,3,4]
輸出:[2,1,4,3]
示例 2:
輸入:head = []
輸出:[]
示例 3:
輸入:head = [1]
輸出:[1]
2. 題解
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null){return head;}ListNode next = head.next;head.next = swapPairs(next.next);next.next = head;return next;}
}
3. 解釋
出自這位老師:畫手大鵬
-
public ListNode swapPairs(ListNode head) 是方法聲明,表示這個名為swapPairs的方法接受一個參數,即鏈表的頭節點。該方法返回一個ListNode類型的值。
-
if(head == null || head.next == null){ return head; } 如果鏈表為空或只有一個節點,那么直接返回這個單獨的節點作為結果(因為沒有需要交換的元素)。
-
ListNode next = head.next; 獲取第二個節點。
-
head.next = swapPairs(next.next); 遞歸調用函數來處理下一對,并將結果鏈接到當前頭部。這樣做是為了保持列表的順序(因為我們正在交換每一對)。
-
next.next = head; 將第一個節點設置為第二個節點的后繼節點。這行代碼實際上是完成了兩個節點的交換。
-
return next; 返回新的頭部,即剛剛交換的那個節點。
-
這段代碼的時間復雜度是O(n),空間復雜度是O(1),其中n是鏈表中的節點數量。因為我們只使用了一個常數量的額外變量,不管輸入的大小如何,所花費的時間和空間都是恒定的。