給定單鏈表,將所有奇數位置節點(第 1、3、5... 個)移至前部,偶數位置節點移至後部。要求:
範例:
輸入: 1→2→3→4→5→NULL
輸出: 1→3→5→2→4→NULL
關鍵洞察:奇節點的下一個是偶節點的下一個(即下一個奇節點),偶節點的下一個是奇節點的下一個(即下一個偶節點)。
維護兩條鏈:
odd 指向奇鏈尾,even 指向偶鏈尾evenHead 記住偶鏈頭,最後連接迭代邏輯:
odd->next = even->next; // 奇接下一奇
odd = odd->next;
even->next = odd->next; // 偶接下一偶
even = even->next;
循環條件:odd->next && even->next(確保都有下一個)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if (!head) return head;
ListNode* odd = head;
ListNode* even = head->next;
ListNode* evenHead = even;
while (odd->next && even->next) {
odd->next = even->next;
odd = odd->next;
even->next = odd->next;
even = even->next;
}
odd->next = evenHead;
return head;
}
};
朴素版:用 head 遍歷 + bool isOdd 判斷 + 額外 oddHead,邏輯繁雜,需處理尾部 NULL 收尾。
優化洞察:
head 即為 oddHead,無需額外變量next 互為對方 next,無需 head 遍歷,直接用 odd/even 推進odd->next,再用新 odd 更新 even->nextNULL,無需額外收尾判斷next 指針odd、even 同步前進,利用 next 互指特性head 直接作為奇鏈頭,返回簡潔奇偶鏈表是鏈表指針操作的精練練習,從「用標記位遍歷」進化到「雙指針互推」體現了演算法優化的思維深度。