单链表的插入排序与数组的插入排序不同,我用了一种简单的方法来实现链表的插入排序,代码如下:
#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&¤tVal<=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);
}