链表插入排序——单指针移动

Posted hzb1224

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表插入排序——单指针移动相关的知识,希望对你有一定的参考价值。

前面分享了双指针移动实现插入排序,第一个指针pre的作用是为了插入数据节点,第二个指针prel作用是和待插入的数据节点进行比较,今天分享只用一个指针实现链表的插入排序。

需要注意的只有一点指针必须在比较的数据节点之前,这样才能实现交换内存地址,从而实现插入功能。

关于图,请大家看前面的双指针实现链表插入排序的博文,只需要将prel这个指针删除掉就行

直接分享核心代码

node *q,*p, *pre;  //q指针指向待插入的数据节点,pre指向被比较的数据节点前面一个节点
    q = head->next->next; //q指向第二个数据节点,实现将一个链表拆分成两个链表
    head->next->next = NULL;//实现拆分成两个链表
    while (q != NULL)  //循环条件,当没有数据节点需要插入为止
    
        p = q->next;  //将下一个待插入的数据节点的地址给p
        pre = head;  //pre指向头节点
        while (pre->next !=NULL && pre->next->a < q->a)//两个条件:第一个条件如果不成立说明待插入的数最大,这时候pre指向最后一个数据节点。第二个条件不成立,说明待插入的数据比被比较的数据小,应该插入到被比较的节点的前面,这时候pre指向数据节点的前面一个节点
            pre = pre->next; //满足两个条件就继续移动pre指向下一个数据节点继续和待插入节点比较
        q->next = pre->next;//下面两行实现节点的插入
        pre->next = q;
        q = p;  //通过p让q指向下一个数据节点继续插入
    

 

以上是关于链表插入排序——单指针移动的主要内容,如果未能解决你的问题,请参考以下文章

链表快排 & 基于链表的排序

LeetCode Algorithm 147. 对链表进行插入排序

LeetCode Algorithm 147. 对链表进行插入排序

链表排序(冒泡选择插入快排归并希尔堆排序)

链表插入排序

对链表进行插入排序