单链表插入排序

来源:互联网 发布:熊猫tv小葫芦数据 编辑:程序博客网 时间:2024/06/15 16:52

使用插入排序对单链表从小到大排序。

基本思想:对原链表中每个节点取出来放在新链表中排序插入。

  1. 带头接单的方法:
    /** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode *insertionSortList(ListNode *head) {        //空链表或长度为1的链表不用排序        if(head == NULL || head->next == NULL) return head;        //建立一个头结点方便插入        ListNode * newhead = new ListNode(0);        ListNode *p = head;        while(p != NULL){            ListNode *ps = newhead;            //备份p节点的下一个节点            ListNode *p_bak = p->next;            while(ps->next != NULL && ps->next->val < p->val){                ps = ps->next;            }            p->next = ps->next;            ps->next = p;            p = p_bak;        }        return newhead->next;    }};
2. 不带头结点:
        ListNode *insertionSortList(ListNode *head) {        if(head == NULL || head->next == NULL) return head;        ListNode *p = head->next;        head->next = NULL;        while(p != NULL){            ListNode *p_bak = p->next, *ps = head, *psre = NULL;            while(ps != NULL && ps->val < p->val){                //为了能够插入,记录比较节点的前驱                psre = ps;                ps = ps->next;            }            p->next = ps;            //当插入节点值比第一个节点小的时候,前驱为NULL,重新设置head            if (psre == NULL)                head = p;            else{                psre->next = p;            }            p = p_bak;        }        return head;    }
原创粉丝点击