下午面了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); }