LeetCode24. 两两交换链表中的节点(2022/10/21)

52 阅读1分钟

本文已参加 新人礼创作礼 活动,一起开启掘金创作之旅

LeetCode24. 两两交换链表中的节点(2022/10/21)

题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

样例

image.png

输入: head = [1,2,3,4]
输出: [2,1,4,3]

示例2:

输入: head = []
输出: []

示例3:

输入: head = [1]
输出: [1]

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

算法1

(模拟) O(n)O(n)
  • 通过题意可知,链表的头结点会发生改变,故为了考虑特殊情况,定义一个虚拟头结点 dummy,使其 dummy.next = head
  • 由于需要两两交换结点,我们需要找到三个结点的位置:需要交换的结点以及交换前一个结点(第一个结点的前一个结点就是dummy),从最开始的三个结点依次为:dummy(p), dummy.next(a), dummy.next.next(b),故在循环时需要判断 dummy.nextdummy.next.next 不为空,交换为了防止结点丢失,需要按照如下步骤进行: image.png 对应伪代码为:
p.next = b;
a.next = b.next;
b.next = a;
p = a;
  • 最后返回 dummy.next 即可
  • ps:这里并不需要判断链表是否为空,直接按照正常处理即可。

Java 代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode p = dummy;
        while(p.next != null && p.next.next != null) {
            ListNode a = p.next;
            ListNode b = p.next.next;
            p.next = b;
            a.next = b.next;
            b.next = a;
            p = a;
        }
        return dummy.next;
    }
}

时间复杂度:O(n),其中 n 是链表的节点数量。需要对每个节点进行更新指针的操作。