024.两两交换链表中的节点,用递归和 while 循环轻松解决
鲁迅曾说,不积跬步无以至千里,不积小流无以成江海。继续坚持刷题,每天进步一天天,日积月累,就会发生质变。希望二哥的 LeetCode 题解越来越好,球友们的算法水平也越来越高。
题意
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
难度
中等
示例
输入:head = [1,2,3,4]
输出:[2,1,4,3]
分析 1
看到这道题,我们要先搞清楚什么是两两交换,比如 1->2->3->4,交换后就是 2->1->4->3。
第一个和第二个交换,第三个和第四个交换,以此类推。
我们可以用递归来解决这个问题,递归的终止条件是当前节点或者下一个节点为空,那么递归的返回值就是当前节点。
比如说 1 和 2 交换后, 2 的 next 指向 1,1 的 next 指向下一次交换后的结果。
我们来看题解的代码:
class Solution {
public ListNode swapPairs(ListNode head) {
// 递归终止条件:链表没有节点或只有一个节点
if (head == null || head.next == null) {
return head;
}
// 准备交换
ListNode firstNode = head;
ListNode secondNode = head.next;
// 递归处理剩下的节点
firstNode.next = swapPairs(secondNode.next);
// 交换
secondNode.next = firstNode;
// 返回交换后新的头节点
回复