題目連結:
題目意譯:
你被給定一個單向連結串列(Singly Linked List)的開頭 head。該串列可以被表示為以下形式:
L0 → L1 → … → Ln - 1 → Ln
請將該串列重新排列成以下形式:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
你不得改變這個串列中的節點值。只有節點本身可以挪動。
限制:
串列中的節點數位於範圍 [1, 5 × 10 ^ 4]。
1 ≦ Node.val ≦ 1000
範例測資:
範例 1:
輸入: head = [1,2,3,4]
輸出: [1,4,2,3]
範例 2:
輸入: head = [1,2,3,4,5]
輸出: [1,5,2,4,3]
解題思維:
本題可以把題目敘述中的新順序視為以下操作之結合:
一:把原串列切一半,分成左右。其中原串列有奇數的節點的時候,最中間的節點往右(含)將屬於右側;而數量為偶數時,最中間兩個節點中的右邊者往右(含)將屬於右側。
二:把右側的串列反轉。
三:把兩個串列交錯在一起。
其中操作一要定位「中間」即是
這題的要求,操作二可以套用
這題的方式。
因此最後需要額外講解的是操作三。作法很簡潔,利用兩個指標 first 和 second 分別指向左側和反轉的右側之頭,然後再定義一個暫存用的指標 buffer,接著做以下步驟直到兩者都掃完為止:
因為等等會動到 first->next,所以先用 buffer 來保留 first->next 之內容。因此接著把 first->next 指向 second。最後把 first 指向 buffer(即原 first->next);
而 second 也是類似。用 buffer 保留 second->next、將 second->next 指向 first,最後再把 second 指回 buffer 即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。