【35.两两交换链表中的节点】

14 阅读1分钟

题目

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

示例 1:

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

题解

方式一:迭代

复杂度:O(n) 创建一个虚拟节点,需要用指针记录后面的两个节点用于交换它们

public ListNode swapPairs(ListNode head) {
    ListNode dummyHead = new ListNode(0, head);
    ListNode temp = dummyHead;
    while (temp.next != null && temp.next.next != null) {
        ListNode node1 = temp.next;
        ListNode node2 = temp.next.next;
        temp.next = node2;
        node1.next = node2.next;
        node2.next = node1;
        temp = node1;
    }
    return dummyHead.next;
}

方式二:递归

复杂度:O(n)
好难想...

public ListNode swapPairs(ListNode head) {
    // 剩下的链表中不足两个节点,结束递归
    if (head == null || head.next == null) {
        return head;
    }
    // 更新指针
    ListNode newHead = head.next;
    head.next = swapPairs(newHead.next); // 老头节点指向下一对的新头节点
    newHead.next = head; // 新头节点指向老头节点实现交换
    // 返回交换后的新头节点
    return newHead;
}

总结

算法:迭代递归