面试题--链表实现插入排序
代码:
/**
* 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) {
if(!head||!head->next){
return head;
}
ListNode* hhead=new ListNode(1); //设立头结点指向第一个节点,方便后续遍历查找
hhead->next=head;
ListNode* cur=head->next,*end=head; //cur表示当前准备排序的节点,end表示已排序完成的最后一个元素
while(cur){
if(cur->val<end->val){ //若是小于已排序序列的最后一个元素,则需要进行插入排序
ListNode* tmp=hhead;
while(cur->val > tmp->next->val){ //找到需要插入位置的前一个结点(需要插入的结点跟在此节点后)
tmp=tmp->next;
}
end->next=cur->next; //剔除当前排序节点
cur->next=tmp->next; //两步插入操作
tmp->next=cur;
cur=end->next; //进行下一个节点的排序
}
else{ //若是小于,则直接加入已排序序列,进行下一个节点的排序
end=end->next;
cur=cur->next;
}
}
return hhead->next;
}
};
虽说不难,但是面试被问到脑子一乱想不出来还是会挺伤的,所以捋一捋思路

浙公网安备 33010602011771号