給定鏈表頭節點 head 和值 x,將鏈表重排使所有 <x 的節點在前,≥x 的節點在後,保持兩部分內部相對順序。要求原地操作,O(1) 額外空間。
dummySmall、dummyLarge,尾指針 tailS、tailL。tailS->next = dummyLarge->next; tailL->next = nullptr;dummySmall->next。
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode dummyS(0), dummyL(0);
ListNode *tailS = &dummyS, *tailL = &dummyL;
while (head) {
ListNode *nxt = head->next;
head->next = nullptr;
if (head->val < x) {
tailS->next = head;
tailS = head;
} else {
tailL->next = head;
tailL = head;
}
head = nxt;
}
tailS->next = dummyL.next;
return dummyS.next;
}
};
head->next = nullptr 防止殘留指針形成環。x, = x, > x):三個虛擬頭節點。Partition List 是鏈表基本操作的綜合考察:遍歷、斷鏈、尾插、合併。虛擬頭節點+雙尾指針模板極其通用,建議熟練掌握並封裝為工具函數。