https://blog.csdn.net/ganggang129/article/details/103961578
文章目录
1. 题目描述
2. 解题方法及代码
2.1 循环法
2.2 递归法
3. LeetCode练习代码仓库(gitee)
1. 题目描述
LeetCodeCN链接
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
2. 解题方法及代码
2.1 循环法
当还有大于等于4个节点没处理时,两个两个节点依次处理,最后只剩下2个或3个节点没有处理(剩余2个节点也可以看成第3个节点为null),处理尾部节点即可。如果为空链表或是只有一个节点,就直接返回head节点(空链表head节点为null)。
class Solution {
public ListNode swapPairs(ListNode head) {
if (head != null && head.next != null) {
ListNode newhead = head.next;
ListNode p1 = head;
ListNode p2 = head.next;
while (p2.next != null && p2.next.next != null) {
ListNode p3 = p2.next;
ListNode p4 = p3.next; // 标记好后两个节点
p2.next = p1;
p1.next = p4;
p1 = p3;
p2 = p4;
} // 如果后面还有两个节点p3和p4,让p2指向p1,p1指向p4,然后将p1 p2移到p3 p4
p1.next = p2.next;
p2.next = p1; // 处理最后两个节点
return newhead;
} else return head;
}
}
时间复杂度O(n),空间复杂度O(1)。
LeetCode提交结果: 0 ms 34.3 MB
2.2 递归法
把两个节点看成一组。第一个节点(也就是交换后的第二个节点)的下一个点应该是下一组节点倒序后的头节点。第二个节点(也就是交换后的新头节点)的下一个节点应该是该组第一个节点。swapPairs函数的参数是原链表的表头,返回值是反转后新链表的表头。对于下一组节点的原链表表头即为p2.next,新链表头为swapPairs(p2.next),本组第二个节点(末尾)的后一个节点应该指向下一组节点的新头,因此p1.next = swapPairs(p2.next);。
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) return head;
ListNode p1 = head;
ListNode p2 = head.next;
p1.next = swapPairs(p2.next);
p2.next = p1;
return p2;
}
}
时间复杂度O(n),空间复杂度O(n)。
LeetCode提交结果:0 ms 34.6 MB
3. LeetCode练习代码仓库(gitee)
我的LeetCode练习题