问题描述
Sort a linked list using insertion sort.
解题思路
该问题比较简单,要求我们用插入排序的方法实现链表的排序。
插入排序即遍历链表,然后将其插入到适当的为值即可,我们可以将链表分为两部分,前半部分为已经排序好的,后半部分是还未排序的,用指针指向未排序的头结点,然后遍历排序号的部分,找到第一个大于该值的节点,然后将其插入到该节点之前一个位置即可。然后未排序部分的头结点向后移一个节点即可,直至遍历完整个链表。
代码展示
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
ListNode *newhead = new ListNode(-1);
while(head != NULL){
ListNode *temp = head->next;
ListNode *cur = newhead;
while(cur->next != NULL &&cur->next->val < head->val){
cur = cur->next;
}
head->next = cur->next;
cur->next = head;
head = temp;
}
return newhead->next;
}
};
int main(){
cout<<"请输入链表长度 N :";
int n;
cin>>n;
ListNode *head = NULL;
ListNode *p;
int a;
cout<<"请输入链表元素:";
while(n--){
cin>>a;
if(head == NULL){
head = (ListNode *)malloc(sizeof(ListNode));
head->val = a;
p = head;
}
else{
p->next = (ListNode *)malloc(sizeof(ListNode));
p = p->next;
p->val = a;
}
}
p->next = NULL;
Solution solution;
ListNode* result = solution.insertionSortList(head);
while(result != NULL){
if(result->next == NULL){
cout<<result->val<<endl;
}
else{
cout<<result->val<<" -> ";
}
result = result->next;
}
cout<<endl;
return 0;
}
实验结果展示