思路:
1、将单链表分成两部分,一部分为已排好的链表(sort),另一部分为待排序的链表(cur)。
默认第一个节点为已排好的链表(头节点不含数据元素)
2、每次把cur中的第一个节点插入到有序的链表sort中。
![]()
/*
单链表就地插入排序
思路:
1、将单链表分成两部分,一部分为已排好的链表(sort),另一部分为待排序的链表(cur)。
默认第一个节点为已排好的链表(头节点不含数据元素)
2、每次把cur中的第一个节点插入到有序的链表sort中。
*/
void insert_sort_list (LinkList head)
{
LNode *sort = head,*cur,*temp; //sort指向已排好的链表;cur指向待排序链表;temp为临时指针
cur = sort->next->next; //cur指向待比较节点,做为待比较的序列
sort->next->next = NULL; //设置第二个节点next为NULL,做为有序序列
while( cur != NULL )
{
while( sort->next != NULL && sort->next->key < cur->key )//查找插入点的前驱节点
sort = sort->next;
temp = cur->next; //保存待比较的下一个节点
cur->next = sort->next;
sort->next = cur; //插入节点
sort = head; //恢复sort的head
cur = temp; //cur指向下一个待比较节点
}
}
//单链表就地逆序
//思路和就地排序一样,只不过不需要比较
void inverse_order_list (LinkList head)
{
LNode *pre = head,*cur,*temp; //sort指向已排好的链表;cur指向待排序链表;temp为临时指针
cur = pre->next; //cur指向待比较节点,做为待比较的序列
pre->next = NULL; //设置第二个节点next为NULL,做为有序序列
while( cur != NULL )
{
temp = cur->next; //保存待比较的下一个节点
cur->next = pre->next;
pre->next = cur; //插入节点
cur = temp; //q指向下一个待比较节点
//pre = head; //恢复pre的head
}
}