Loading...

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

题解

class Solution {
    /**
     * 1->2->3->4
     * p:0->1->2->3->4
     * before = p.next = 1
     * after = p.next.next = 2
     * 交换
     * 第一步,由 1 指向 3:before.next = after.next
     * 第二步,由 0 指向 2:p.next = after
     * 第三步,由 2 指向 1:after.next = before
     * 当前链条:0->2->1->3->4
     * 交换完成,下次循环 p 从 1 开始交换后面的元素:p = before
     * p: 1->3->4
     */
    public ListNode swapPairs(ListNode head) {
        // 当链表为空时或者只有一个值时返回当前链表
        if (head == null || head.next == null) return head;
        // 创建首节点指向 head
        ListNode result = new ListNode(0, head);
        // 遍历的节点
        ListNode p = result;
        // 是否存在两个节点可交换
        while (p.next != null && p.next.next != null){
            // 待交换的两值
            ListNode before = p.next;
            ListNode after = p.next.next;
            // 交换
            before.next =  after.next;
            p.next = after;
            after.next = before;
            // 下一次交换的起点
            p = before;
        }
        return result.next;
    }
}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/swap-nodes-in-pairs