單鏈錶快排(momenta一面題) ---C++面試

下午面了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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章