zoukankan      html  css  js  c++  java
  • 单链表插入排序

    输入:一个无序的单链表的头结点

    输出:一个有序的单链表的头结点(这里假设是升序排序)

    分析:

    1. 插入排序的基本思想:将一个节点插入到一个有序的序列中。对于链表而言,要依次从待排序的链表中取出一个节点插入到已经排好序的链表中,也就是说,在单链表插入排序的过程中,原链表会截断成两部分,一部分是原链表中已经排好序的节点,另一部分是原链表中未排序的节点,这样就需要在排序的过程中设置一个当前节点,指向原链表未排序部分的第一个节点。

    注意单链表插入排序和数组插入排序的不同:数组插入排序是从排好序的部分的最后一个节点往前找,找到第一个比它小的数,然后插到其后面;而单链表只能从前往后遍历,找到第一个比当前节点大的值结束,因此在遍历已经排好序的链表部分的时候,需要两个指针,一个指针用于往前遍历(该指针假设为遍历指针),一个指针用于记录遍历指针指向的当前节点的前一个节点(该指针假设为遍历指针),这样当遍历指针找到第一个比待插入节点的值大的节点的时候,就可以将待插入节点插入到记录指针的后面。(之所以使用两个指针,是因为单链表不能反指)

         插入排序分两种情况,一种是当前节点的值比已经排好序的尾节点的值大,则直接将当前节点挂在已排序的节点即可;一种是当前节点值比已经排好序的尾节点的值小,则需将已排好序的链表部分从头到尾遍历,找到第一个比当前节点值大的节点,插入到其前面即可。因为可能待插入的节点可能在第一个节点的前面,因此另外创建一个头结点,指向已经排好序的链表的第一个节点。这样可以每次插入新的节点的时候,将上面所提到的记录节点初始化为新创建的头结点,这样便于在第一个节点前面插入新节点。

    代码如下:

     1 ListNode *insertionSortList(ListNode *head) {
     2         if(!head||head->next==NULL) return head;
     3         ListNode *pHead=new ListNode(-10000); //为了便于在头结点的前面插入节点
     4         pHead->next=head;
     5         ListNode *pFirst = head; //指向前面一段链表头节点
     6         ListNode *pLast=head; //指向前面一段链表尾节点 
     7         ListNode *pNode=head->next; //记录当前节点
     8         ListNode *pTemp=NULL;  //遍历指针
     9         
    10         pLast->next=NULL;
    11         while(pNode!=NULL)
    12         {
    13             ListNode *pInsert=pHead; //记录指针
    14             ListNode *pNext=pNode->next;
    15             if(pNode->val < pLast->val)
    16             {
    17                 pTemp=pFirst;
    18                 while(pTemp!=NULL && pNode->val>=pTemp->val)
    19                 {
    20                     pInsert=pTemp;
    21                     pTemp=pTemp->next;
    22                 }
    23                 pInsert->next=pNode;
    24                 pNode->next=pTemp;
    25                 pFirst=pHead->next;
    26                 pNode=pNext;
    27             }
    28             else
    29             {
    30                 pLast->next=pNode;
    31                 pNode->next=NULL;
    32                 pLast=pNode;
    33                 pNode=pNext;
    34             }
    35         }
    36         delete pHead;
    37         return pFirst;
    38     }
  • 相关阅读:
    【面积并】 Atlantis
    【动态前k大 贪心】 Gone Fishing
    【复杂枚举】 library
    【双端队列bfs 网格图建图】拯救大兵瑞恩
    【奇偶传递关系 边带权】 奇偶游戏
    【权值并查集】 supermarket
    CF w4d3 A. Pythagorean Theorem II
    CF w4d2 C. Purification
    CF w4d2 B. Road Construction
    CF w4d2 A. Cakeminator
  • 原文地址:https://www.cnblogs.com/hubavyn/p/3800121.html
Copyright © 2011-2022 走看看