题目要求:
若已知L为带头结点的非空线性链表,试写一个在时间和空间效率上尽可能高效的算法void MoveNode(LinkList &L),将L中数据域值最小的那个结点移到L的头结点之后(不允许用直接交换数据域的方法)。
代码实现:(算法)
void MoveNode(LinkList& L)
{
LNode* p = L;
LNode* q = p->next;
while (q->next)
{
if (p->next->data > q->next->data) //p的后一个元素与p的后一个的后一个元素比较,防止最后q指向空
p = q;
q = q->next;
}
LNode* res = p->next;
p->next = res->next; //删除data最小的元素
res->next = L->next; //在头节点后data最小的元素
L->next = res;
}
核心思想:
总是让基准元素的下一个与下下一个比较大小,目的是便于节点的删除,p结点指向最小元素的前一个元素, res指向最小元素。