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

前面分享了双指针移动实现插入排序,第一个指针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指向下一个数据节点继续插入
    }

原文地址:https://www.cnblogs.com/hzb1224/p/11326323.html

时间: 2024-10-24 08:32:54

链表插入排序——单指针移动的相关文章

单链表插入排序

输入:一个无序的单链表的头结点 输出:一个有序的单链表的头结点(这里假设是升序排序) 分析: 1. 插入排序的基本思想:将一个节点插入到一个有序的序列中.对于链表而言,要依次从待排序的链表中取出一个节点插入到已经排好序的链表中,也就是说,在单链表插入排序的过程中,原链表会截断成两部分,一部分是原链表中已经排好序的节点,另一部分是原链表中未排序的节点,这样就需要在排序的过程中设置一个当前节点,指向原链表未排序部分的第一个节点. 注意单链表插入排序和数组插入排序的不同:数组插入排序是从排好序的部分的

20140428 宏定义 单链表翻转 野指针

1.宏定义swap,加括号有什么意义 #define swap(x,y) x = (x)+(y):y=(x)-(y):x=(x)-(y) 加括号是为了处理表达式参数(即宏的参数可能是个算法表达式)时不出错,因为宏替换就是文本替换,所以如果有以下情况: #define COM(A,B) (A)*(B) 那么COM(6+5,3),它会换成这样: (6+5)*(3) 但是如是去掉了定义中括号,即写成这样: #define COM(A,B) A*B 那么COM(6+5,3),它就会换成这样:6+5*3

单链表的头指针、头结点与首元结点

继续我们昨天所说的单链表.单链表也是一种线性表,所以总得有个头有个尾.链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了.之后的每一个结点,其实就是上一个的后继指针指向的位置.雅加达娱乐城 这里有个地方要注意,就是对头指针概念的理解,这个很重要.“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针.画一个图吧. 这个图看起来很清晰了.比如说头结点,我们就可以这么描述了: 头结点是为了操作的统一与方便而设立的,放在第一个元

链表插入排序、链表归并排序

1.链表 1.1链表的存储表示 //链表的存储表示 typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; 1.2基本操作 创建链表: /* * 创建链表. * 形参num为链表的长度,函数返回链表的头指针. */ LinkList CreatLink(int num) { int i, data; //p指向当前链表中最后一个结点,q指向准备插入的结点.

【LeetCode-面试算法经典-Java实现】【147-Insertion Sort List(链表插入排序)】

[147-Insertion Sort List(链表插入排序)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Sort a linked list using insertion sort. 题目大意 对一个单链表表进行插入排序 解题思路 使用一个指针p指向未排好序的链表的第一个结点,在排序好的部分中找到找第一个大于等于q的前驱结点,将p对应的结点插入到正确位置,p重新指向未排好序的链表的第一个结点.直到链表完成排序好. 代码实现 结点类 算法实现类 publi

使用单指针域实现双向链表

数学基础 离散数学中的异或运算 a⊕b ,具有以下性质: a⊕b = b⊕a a⊕a = 0 a⊕0 = a a⊕(a⊕b) = (a⊕a)⊕b = b (a⊕b)⊕b = a⊕(b⊕b) = a 利用异或运算的这些性质,我们可以只用一个指针域,来实现一个双向链表. 单指针域双向链表的逻辑结构 下图是一个具有五个节点的双向链表的逻辑结构示意图,没有头结点. 其中每个节点的后半部分表示指针域,存储了它的前驱节点的指针与后继借点的指针的异或值.我们从最左边的节点开始遍历,就可是使用 0 ^ (0^P

13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 题目分析: 1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一

数据结构 链表_单链表的接口定义

链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操作时链表拥有更高的效率.链表需要动态的开辟存储空间,也就是存储空间是在程序运行时分配的.由于在很多应用中数据的大小在编译时并不能确定,因此这种动态分配空间的特性也是链表的一个优点. 单链表介绍 单链表(简称为链表)由各个元素之间通过一个指针彼此链接起来而组成.每个元素包含两个部分:数据成员和一个称为

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

#include <iostream> #include <string.h> #include <stdlib.h> #include <stack> using namespace std; struct Node { int data; struct Node* next; }; struct Node* create_list(int len) { if (len <= 0) return NULL; struct Node* head; st