下午面了momenta,單鏈錶快排沒答出來,是自己能力不夠,正好可以查漏。
思路:利用節點值域的交換,主要思想還是partiiton,將鏈表分隔成左右兩部分,按照頭結點的data(即爲tag),左邊的data都小於tag,右邊的data都大於tag
node* partition(node* &head, node* end) {
//鏈表爲空或者head == end 爲遞歸出口
if (!head || head == end)
return head;
//p在前 q在後
node* p = head;
int tag = head->data;
node* q = head->next;
while (q != end) {
if (q->data < tag) {
//此時p q相鄰
if (p->next == p) {
int t = p->data;
p->data = q->data;
q->data = t;
}
//此時p q不相鄰 始終保證p->data = tag
else {
int t = p->data;
p->data = q->data;
q->data = p->next->data;
p->next->data = tag;
}
p = p->next;
q = q->next;
}
else {
q = q->next;
}
}
return p;
}
void quickSortOfLinkList(node* &head, node* end) {
//鏈表爲空或者只有一個節點
if (!head || head == end)
return;
node* p = partition(head, end);
quickSortOfLinkList(head, p);
quickSortOfLinkList(p->next, end);
}