持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情
周二了,距离周末还有4天,但是距离我心中的自由呢?
两两交换链表中的节点
该题出自力扣的24题 —— 两两交换链表中的节点【中等题】
审题
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
- 极其简短的题目,反映出并不简单的内涵,给出一个链表的头结点,要求在不修改节点内部值的情况下,两两交换节点,那么就只能通过节点的互换,而不能通过小聪明去置换内部值了
- 要理解这道题,就是分成A、B、C三个节点,设置B的next节点为A,A的next节点为C,并不断循环,直到当前节点为null,递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。
- 找返回值:返回给上一层递归的值应该是已经交换完成后的子链表。
- 递归方法的浓缩就是重复进行单次的动作:所以从宏观上考虑,只用考虑某一步是怎么完成的。我们假设待交换的俩节点分别为head和next,next的应该接受上一级返回的子链表。就相当于是一个含三个节点的链表交换前两个节点,也就是刚刚举例的ABC节点一样,就很简单了。因为递归本质就是不断重复相同的事情
- 时间复杂度为O(n),因为需要遍历整个链表
- 空间复杂度也为O(n),因为递归需要压栈,n也就是节点的数量
编码
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null){
return head;
}
ListNode index = head.next;
head.next = swapPairs(index.next);
index.next = head;
return index;
}
}