1. 程式人生 > 其它 >6. 連結串列 - 兩兩交換連結串列中的節點

6. 連結串列 - 兩兩交換連結串列中的節點

技術標籤:LeetCode連結串列leetcodejava資料結構

1.題目

LeetCode: 24. 兩兩交換連結串列中的節點

【medium】

給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

示例 1:

輸入:head = [1,2,3,4]

輸出:[2,1,4,3]

示例 2:

輸入:head = []

輸出:[]

示例 3:

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

提示:

連結串列中節點的數目在範圍 [0, 100] 內

0 <= Node.val <= 100

2.解題

方法一:迭代法

定義一個臨時節點,在遍歷連結串列時交換兩個相鄰的節點

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 newList = new ListNode(-1); newList.next = head; ListNode tmp = newList; while (tmp.next != null && tmp.next.next != null) { ListNode node1 = tmp.next; ListNode node2 = tmp.next.next; tmp.next = node2;
node1.next = node2.next; node2.next = node1; tmp = node1; } return newList.next; } }

時間複雜度:O(n)

空間複雜度:O(1)

方法二:遞迴法

遞迴出口:當連結串列中沒有節點或只有一個節點時,無法交換,直接返回

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) {
        if (head == null || head.next == null) return head;
        ListNode tmp = head.next;
        head.next = swapPairs(tmp.next);
        tmp.next = head;
        return tmp;
    }
}

時間複雜度:O(n)

空間複雜度:O(n)