LeetCode 24. 两两交换链表中的节点

题目描述

24. 两两交换链表中的节点

image-20230306193333611

思路分析

解法一:迭代指针交换(推荐)

核心思路

  • 使用虚拟头节点方便处理头部交换。
  • 每次取相邻两个节点进行交换,指针按固定顺序调整。
  • 迭代向后推进,直到不足两个节点。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示链表长度。
  • 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy;

        while (prev.next != null && prev.next.next != null) {
            ListNode first = prev.next;
            ListNode second = first.next;

            // 交换节点
            first.next = second.next;
            second.next = first;
            prev.next = second;

            prev = first;
        }

        return dummy.next;
    }
}
func swapPairs(head *ListNode) *ListNode {
	dummy := &ListNode{Next: head}
	prev := dummy

	for prev.Next != nil && prev.Next.Next != nil {
		first := prev.Next
		second := first.Next

		// 交换节点
		first.Next = second.Next
		second.Next = first
		prev.Next = second

		prev = first
	}

	return dummy.Next
}

相似题目

题目 难度 考察点
206. 反转链表 简单 链表操作
92. 反转链表 II 中等 链表操作
25. K 个一组翻转链表 困难 链表操作
143. 重排链表 中等 链表操作
61. 旋转链表 中等 链表操作
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/54774613
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!