题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]示例 2:
输入:head = [] 输出:[]示例 3:
输入:head = [1] 输出:[1]提示:
- 链表中节点的数目在范围
[0, 100]
内0 <= Node.val <= 100
AC代码以及详细注释
/**
* @author : 一陸向北
* @date : 2023/11/4
* @time: 18:38
* @Description: Given a linked list, swap every two adjacent nodes and return its head.
* You must solve the problem without modifying the values in the list's nodes
* (i.e., only nodes themselves may be changed.)
* 时间复杂度:O(n)
* 空间复杂度:O(1)
* 方法名称:双指针法
* 方法描述:使用两个指针,一个指针指向当前节点,另一个指针指向当前节点的前一个节点。分别交换两个指针指向的下一个节点。
*/
class Solution {
public ListNode swapPairs(ListNode head) {
// 初始化一个前置节点为null
ListNode pre = null;
// 初始化当前节点为链表的头部
ListNode cur = head;
// 初始化返回节点为链表的头部
ListNode ret = head;
// 当当前节点和它的下一个节点不为空时,循环遍历链表
while (cur != null && cur.next != null ) {
// 如果前置节点不为空
if (pre != null) {
// 存储当前节点的下一个节点的下一个节点
ListNode temp = cur.next.next;
// 将前置节点的下一个节点设置为当前节点的下一个节点
pre.next = cur.next;
// 将前置节点的下一个节点的下一个节点设置为当前节点
pre.next.next = cur;
// 将当前节点的下一个节点设置为存储的节点
cur.next = temp;
} else { // 第一次交换,即前置节点为null
// 存储当前节点的下一个节点的下一个节点
ListNode temp = cur.next.next;
// 将返回节点设置为当前节点的下一个节点
ret = cur.next;
// 将当前节点的下一个节点的下一个节点设置为当前节点
cur.next.next = cur;
// 将当前节点的下一个节点设置为存储的节点
cur.next = temp;
}
// 将前置节点设置为当前节点
pre = cur;
// 移动到下一个节点
cur = cur.next;
}
// 返回交换后的链表的头部
return ret;
}
}
时间及空间复杂度
-
时间复杂度:O(n),其中 n 是链表长度。执行用时:0ms,击败 100%使用 Java 的用户
-
空间复杂度:O(1),内存消耗:37.96MB,击败 79.00%使用 Java 的用户