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