数据结构:单链表的排序

描述

  给定一个单链表的头结点head(该结点有值),长度为n的无序单链表,对其按升序排序后,返回新链表。如当输入链表 {3,1,4,5,2} 时,经升序排列后,原链表变为 {1,2,3,4,5},对应的输出为 {1,2,3,4,5}。

代码实现

C语言代码:

 

struct ListNode* sortInList(struct ListNode* head ) {
    if (head == NULL) 
        return NULL;
    //添加一个头指针,指向head,方便后面的排序
    struct ListNode *H;
    H = malloc(sizeof(struct ListNode));
    H->next=head;
    //第一步:定义三个指针
    struct ListNode*p,*q,*r;
    //第二步:将p指向head,并将头指针断开链接
    p = H->next;
    H->next = NULL;
    //遍历链表
    while(p)
    {
        //第三步:q指向当前要操作的结点,p后移,r指向头指针
        q=p; 
        p=p->next;
        r=H;
        //第四步:将r的后继数值与当前操作结点q的值进行比较
        //若条件成立,r后移一个位置后,继续进行比较
        //若条件不成立,跳出while循环,将q指向r的后继,r的后继指向q
        while(r->next && r->next->val < q->val)
            r=r->next;  
        q->next = r->next;
        r->next = q;
    }
    //第五步:返回头指针H的后继结点链表
    return H->next;
}

 

图解代码

第一步:定义三个指针

数据结构

第二步:将p指向head,并将头指针断开链接

数据结构

第三步:q指向当前要操作的结点,p后移,r指向头指针

数据结构

第四步:将r的后继数值与当前操作结点q的值进行比较:若条件成立,r后移一个位置后,继续进行比较;若条件不成立,跳出while循环,将q指向r的后继,r的后继指向q

数据结构

数据结构

数据结构

数据结构

数据结构

数据结构

数据结构

第五步:返回头指针H的后继结点链表

数据结构

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分