LeetCode热题100--24. 两两交换链表中的节点--中等
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是链表中的节点数量。因为我们只使用了一个常数量的额外变量,不管输入的大小如何,所花费的时间和空间都是恒定的。