两两交换链表中的节点
- 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。
- 你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
解题思路
- 这个问题可以通过递归或迭代来实现。下面提供一种迭代的方法
- 1、使用两个指针 prev 和 current,以及一个额外的指针 dummyHead 作为头节点。
- 2、每次交换两个节点,将它们的前后关系调整正确
具体步骤
- 1、初始化 dummyHead 为一个新的节点,指向链表的头节点。
- 2、初始化 prev 指向 dummyHead。
- 3、初始化 current 指向链表的头节点。
- 4、在循环中,交换 current 和 current.next 两个相邻的节点,同时更新 prev 和 current 的位置。
- 5、指针移动完成后,更新 prev 指向下一组相邻节点的前一个节点。
- 6、重复步骤4和步骤5直到遍历完整个链表。
Java实现
public class SwapPairs {static class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}}public ListNode swapPairs(ListNode head) {ListNode dummyHead = new ListNode(0);dummyHead.next = head;ListNode prev = dummyHead;while (head != null && head.next != null) {// 保存当前两个相邻节点ListNode first = head;ListNode second = head.next;// 交换两个相邻节点prev.next = second;first.next = second.next;second.next = first;// 更新 prev 和 head 的位置prev = first;head = first.next;}return dummyHead.next;}public static void main(String[] args) {// 构造链表 1 -> 2 -> 3 -> 4ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);// 调用 swapPairs 方法交换相邻节点SwapPairs solution = new SwapPairs();ListNode result = solution.swapPairs(head);// 打印交换后的链表while (result != null) {System.out.print(result.val + " ");result = result.next;}}
}
时间空间复杂度
- 时间复杂度:O(n),其中 n 是链表的长度,需要遍历一次链表。
- 空间复杂度:O(1),只需要使用常数级别的额外空间