算法思路:重新有序创建链表,即先将原链表L变成一个只有首结点的单结点链表,显然此时的单结点链表一定是递增有序的,在此之前应该用指针p记录原链表的除首结点之外的哪些节点,即p=p->next->next,然后遍历链表p,依次将链表p中的结点取下来,插入到链表L中的合适位置,使得插入结点之后链表L之后链表L依然递增有序,具体做法是每次要插入p链表中的结点之前先遍历链表L找到第一个大于p中结点的结点q,记录q结点的前驱结点pre,将q中的结点插入到pre之后即可
算法实现:
//对链表进行排序
void Sort(LinkList& L)
{
LNode* p = L->next->next; //p用于遍历原链表中第二个结点往后的那些结点
L->next->next = NULL; //建立一个只有一个结点的有序链表
LNode* pre, * temp, * q;
while (p != NULL)
{
temp = p->next; //用于取得链表p的下一个节点
//找到p结点在L链表中的位置,将其插入该位置
for (pre = L, q = L->next; q != NULL; pre = q, q = q->next)
{
if (q->data > p->data)
break;
}
p->next = pre->next;
pre->next = p;
p = temp;
}
}
算法效果: