6. 連結串列 - 兩兩交換連結串列中的節點
阿新 • • 發佈:2020-12-21
技術標籤: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)