Files
LeetCode/链表/9. 两两交换链表中的节点.md

1.6 KiB
Raw Permalink Blame History

两两交换链表中的节点

题目

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

示例 1:

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

输入:head = [] 输出:[] 示例 3:

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

提示:

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

思路

  • 模拟
  • 结束条件
    • cur.next == null || cur.next.next == null

代码

/**
 * 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) {
        // Special
        if (head == null || head.next == null) {
            return head;
        }
        // Init: dummyHead, cur
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        ListNode cur = dummyHead;
        // Traverse: Swap
        while (cur.next != null && cur.next.next != null) {
            // Swap: A(cur.next) B(cur.next.next)
            ListNode tmp1 = cur.next;
            ListNode tmp2 = cur.next.next;
            ListNode tmp3 = cur.next.next.next;
            cur.next = tmp2;
            cur.next.next = tmp1;
            cur.next.next.next = tmp3;

            cur = cur.next.next;
        }

        return dummyHead.next;
    }
}