单链表 插入排序

思想:把待排序的链表分为已经排序的链表,和剩余未排序的链表

例如:3->4->1->5->2->NULL

已经排序完毕的的链表:(从第一个数开始) 3->NULL

未排序完毕的链表:4->1->5->2                                    用p表示还未排序的剩余链表的首节点

例如:3->4->NULL                    ready

1->5->2->NULL

每次已经排序完毕的链表的尾节点的next指针都是NULL

ListNode* insertsort( ListNode*head){
     if(head==NULL||head->m_pNext==NULL) return head;

     ListNode* p=head->m_pNext;          //从第二个节点开始
     head->m_pNext=NULL;                 //首个元素next置为NULL
    while(p!=NULL){
         ListNode*temp=head;                    

         ListNode*prev=NULL;
         while(temp!=NULL&&temp->m_nValue<=p->m_nValue){
            prev=temp;
            temp=temp->m_pNext;
        }
        if(temp==NULL){
            prev->m_pNext=p;
             ListNode*last=p;
             p=p->m_pNext;
             last->m_pNext=NULL;
        }
        else if(temp->m_nValue>p->m_nValue){
             ListNode*first=p;
             p=p->m_pNext;
             first->m_pNext=head;
            head=first;
        }
        else {
            ListNode* mid=prev->m_pNext;
             ListNode*next=p;
             p=p->m_pNext;
             prev->m_pNext=next;
             next->m_pNext=mid;
        }
    }
    return head;
}
时间: 2024-10-24 01:42:43

单链表 插入排序的相关文章

单链表插入排序

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

Insertion Sort List(单链表插入排序)

来源:https://leetcode.com/problems/insertion-sort-list Sort a linked list using insertion sort. 方法: 1. 使用一个preHead指向头节点,这样在将节点插入头节点前面时(即某个节点值比头节点小)不需要进行特殊处理 2. 从头节点开始遍历,如果当前节点的下一个节点的值比当前节点的值大,就从头开始遍历找到第一个比当前节点的下一个节点的值大的节点,并插入到它的前面,注意插入时需要同时处理节点移出位置和插入位

C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)

1题目 实现两个链表的合并 2基本功能要求: 1.建立两个链表A和B,链表元素个数分别为m和n个. 2.假设元素分别为(x1,x2,-xm),和(y1,y2, -yn).把它们合并成一个线性表C,使得: 当m>=n时,C=x1,y1,x2,y2,-xn,yn,-,xm 当n>m时,C=y1,x1,y2,x2,-ym,xm,-,yn 3.输出线性表C: 用直接插入排序法对C进行升序排序,生成链表D,并输出链表D. 3测试数据: (1)A表(30,41,15,12,56,80) B表(23,56,

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

前面分享了双指针移动实现插入排序,第一个指针pre的作用是为了插入数据节点,第二个指针prel作用是和待插入的数据节点进行比较,今天分享只用一个指针实现链表的插入排序. 需要注意的只有一点指针必须在比较的数据节点之前,这样才能实现交换内存地址,从而实现插入功能. 关于图,请大家看前面的双指针实现链表插入排序的博文,只需要将prel这个指针删除掉就行 直接分享核心代码 node *q,*p, *pre; //q指针指向待插入的数据节点,pre指向被比较的数据节点前面一个节点 q = head->n

单链表实现多项式的表示及运算

单链表实现多项式的加法运算 最近学习数据结构的线性表,有顺序存储和链表两种,多项式的表示和运算,最能巩固学习成果,现在提供详细代码,来实现多项式的加法运算. 多项式用单链表最为合适,不会造成更多的资源浪费. 如果你恰好用的这本书--数据结构(Java版)(第4版)(叶核亚),推荐你去下面这个链接下载书本源代码,将更助你学的轻松. http://download.csdn.net/detail/wang______jing/9907538 1 //单链表类,实现一些基本单链表的操作 2 publi

线性表—单链表

.1.链式存储结构实现 单链表和双链表(这边讲单链表). 2.基础概念 a.结点:结点由数据域和地址域(链)两部分组成.而结点整体在效果上可以看作是该结点的地址(指针).这个地址域一般是后继元素的地址(即下一个结点的总体).所以最后一个元素的地址域为^,其表示空,即没有后续元素.b.单链表:每个结点只有一个地址域的线性链表称为单链表.c.双链表:每个结点有两个地址域的线性表链称为双链表,两个地址域分别指向前驱元素和后继元素. 3.单链表的实现 线性表接口LList: package com.cl

将单链表排序的两种方法

对单链表排序,通常有两种方法.(PS:考察一个程序员的C语言编程功底,通常看他是否能娴熟的操作链表就知道了.) 方法1:将每一个结点保存到额外的数组中,对数组进行排序,然后根据有序的数组重新构建链表. 方法2:直接对链表进行插入排序,但是实现起来比较复杂一些. 显然,方法1最为简单,因为将链式存储L先转化为顺序存储a[],对顺序存储a[]排序,就避免了较为复杂的链接指针操作.一旦对顺序存储a[]排好序后,根据a[]重新构建一个链表是易如反掌的事情. 1. 单链表的定义如下 typedef str

线性单链表

昨天提到了用线性单链表实现直接插入排序,所以准备借此复习一下线性单链表的内容......(很惭愧,两个学期没再摸数据结构,记不得了) 线性单链表是一种非随机存取的存储结构.因为与顺序表不同的是,链表结构中结点的位置不是连续的,需要通过链表中的结构指针来单向指引(如果是双向链表,则是双向指引.) 链表中的结点,由两个部分构成,一个是数据域,一个是指针域.指针域可以有一到两个,其中存储的指针,既有指向直接前驱的,也有指向直接后继的.在单链表中,只有指向直接后继的指针. 单链表由头指针开始,头指针指向

单链表排序(插入与归并)

struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; /* * 单链表的插入排序, 插入排序是一种稳定排序 */ class Solution7 { public: ListNode* insertionSortList(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode *