mysql資料庫鎖MDL鎖的解釋
阿新 • • 發佈:2021-12-05
迭代
class Solution { public ListNode oddEvenList(ListNode head) { if (head == null){ return head; } /** * 類似於《86. 分割連結串列》,奇數位置的節點不動,將偶數位置的節點全部放到最後面,原地完成 */ ListNode prev = new ListNode(-1); prev.next = head; ListNode cur = head; ListNode last = cur; int size = 1; while (last.next != null){ last = last.next; size++; } /** * 使用size和for迴圈來遍歷,因為需要判斷索引的奇偶性,不能用while迴圈 */ for (int i = 1; i <= size; i++) { if (i % 2 != 0){ prev = cur; cur = cur.next; } else { /** * 將節點放到最後,還要維護下last * 如果這是最後一個節點,就不用判斷了 */ if (cur.next == null){ break; } prev.next = cur.next; last.next = cur; last = last.next; cur = prev.next; } } /** * 最終的last要指向null,頭節點始終是奇數不用動 */ last.next = null; return head; } } /** * 時間複雜度 O(n) * 空間複雜度 O(1) */
優化1——不用單獨判斷奇偶
class Solution { public ListNode oddEvenList(ListNode head) { if (head == null || head.next == null){ return head; } /** * 先保證至少有兩個節點,分別作為奇連結串列和偶連結串列的頭節點 * 遍歷時奇節點指向下一個偶節點的next,偶節點指向下一個奇節點的next,完成一輪節點分離 */ ListNode oddHead = head; ListNode evenHead = head.next; ListNode odd = oddHead; ListNode even = evenHead; /** * 每當判斷一個節點的next是否為空時,一定要先保證自己不為空 */ while (even != null && even.next != null){ odd.next = even.next; odd = odd.next; even.next = odd.next; even = even.next; } odd.next = evenHead; return oddHead; } } /** * 時間複雜度 O(n) * 空間複雜度 O(1) */