单链表的插入排序

来源:互联网 发布:stackblur 算法 编辑:程序博客网 时间:2024/05/22 10:23

单链表的插入排序与数组的插入排序不同,我用了一种简单的方法来实现链表的插入排序,代码如下:

#include <iostream>
using namespace std;

struct ListNode {
int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode *insertionSortList(ListNode *head) {
        if(head==NULL)return head;
ListNode *p = head;
ListNode *q= 0;
while (p!=NULL)
{
int currentVal = p->val;          //获取当前值
q = insertionList(q,currentVal);  //将当前值插入到链表正确的地方
p = p->next;
}
return q;

    }
ListNode *insertionList(ListNode *head,int currentVal)
{
ListNode *p = head;
ListNode *tmp = new ListNode(currentVal);  //新建一个节点
if(head == NULL)    //如果链表是个空链表,则创建一个表头
{
head = new ListNode(currentVal);
return head;
}
if (currentVal<head->val)  //如果插入的值比头结点还要小,那就插在头结点前面
{
tmp->next = p;
head = tmp;
return head;
}
else        //将节点插入在合适的位置
{
while (p->next!=NULL)
{
if (currentVal>=p->val&&currentVal<=p->next->val)  //如果传进来的值大于上一个节点而小于下一个节点,则插入
{
tmp->next = p->next;
p->next = tmp;
return head;
}
p = p->next;
}
p->next = tmp;    //若是到了最后,就把此节点连接在最后即可
tmp->next = NULL;
return head;
}
}
};


void main()
{
Solution s;
ListNode *l1 = new ListNode(1);
l1->next = new ListNode(7);
l1->next->next = new ListNode(3);
l1->next->next->next = new ListNode(5);
l1->next->next->next->next = new ListNode(4);
ListNode *sortedList = s.insertionSortList(l1);
while (sortedList!=NULL)
{
cout<<sortedList->val<<endl;
sortedList = sortedList->next;
}
while(1);
}

0 0