链表的排序涉及到多个指针的移动,以及循环条件的设定,本文记录一种将链表拆分为两个链表,然后插入实现,这种思想和上一篇单链表的反转所利用的方式大同小异,只是多了在list1 中找一个合适的位置插入的判断,具体代码如下:
void list_sort(linklist H)
{
linklist q,p,r;
p = H->next; //拆分出 list2
H->next = NULL; //list1 包含 head
while(p)
{
q = p; //q 作为单独的node与插入到list1中
p = p->next; //p始终指向list2 防止将要插入的元素全都丢失
r = H;
while(r->next && r->next->data < q->data) // 在list1中找大于将于插入的元素的位置
{
r = r->next;
}
q->next = r->next; //插入到r的后面
r->next = q;
}
}
结果如下:
反思:
链表中将链表拆分之后重新组装的方法需要灵活运用
要将复杂问题转换成以前遇到过的问题,再寻求解决办法。