T24. Swap Nodes in Pairs【Medium】
题目
给定一个链表,交换所有邻节点,然后返回它的头结点
举个例子,
给出 1->2->3->4 ,你应该返回的链表是 2->1->4->3。
你的算法应该只使用常量空间。不能修改链表中的值,只能更改节点本身。
思路
这个代码用了递归真的好短!
这里的交换主要是三步(例如交换AB节点):
① 保存B 节点到 n
② 把 A.next 变成 A.next.next (跳过B)
③ 把 B(也就是n)换到前面,也就是把 B.next赋值为 A
其中第二步 A.next.next,也就是这两个后面的串递归,进行一样的处理就ok了
代码
代码取自 Top Solution,稍作注释
/**
* ListNode的数据结构
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode swapPairs(ListNode head) {
//递归到最后,如果为空或者只有一个Node了就直接返回,这也避免了无限递归
if ((head == null)||(head.next == null))
return head;
//通过下面三句实现交换,三句顺序不能变
ListNode n = head.next;
//这句是关键,① 用递归交换后面的邻节点 ② 把 head 节点的 next 改了
head.next = swapPairs(head.next.next);
//把前者换到后面去
n.next = head;
return n;
}
}
补充
前面 每天一题LeetCode【第18天】 也用到了递归~上面还象征性地写了一点递归的东西🙂哈哈就是这样!