单链表的就地插入排序和就地逆序

思路:
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
    }
}

 

posted @ 2020-11-03 20:56  行路难,多歧路  阅读(579)  评论(0)    收藏  举报