思路解析

  1. 虚拟头结点
    为了方便处理头节点被交换的情况,先加一个 dummy 节点,指向 head。

  2. 指针遍历
    用一个 cur 指针从 dummy 开始,每次看 cur.next 和 cur.next.next 两个节点(即一对要交换的节点)。

  3. 交换过程
     

  4. 移动指针
    交换完一对后,cur 移到 first,继续交换下一对。

/**
 * 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(0,head);
        ListNode cur = dummy;

        while(cur.next != null && cur.next.next != null){
            // 定义两个要交换的节点
            ListNode first = cur.next;
            ListNode second = cur.next.next;

            // 交换指针
            first.next = second.next;
            second.next = first;
            cur.next = second;

            // cur 移到下一对的前一个节点
            cur = first;
        }

        return dummy.next;
    }
}
// 时间复杂度:O(n),每个节点最多被访问一次。
// 空间复杂度:O(1),只用常数级指针。

更多推荐