链表的排序一般有插入、冒泡、选择、快排等方式,今天就想自己实现一个,不参考任何其他的程序,一开始想的是按照冒泡排序吧,每轮找到一个最大的,然后把它放到尾巴,再让end指针往前移动,只要head!=end 没有重合,说明排序没有结束,那么继续 然后遇到的问题是,这个head是有数据的,不是一般所指的空的头指针,其次还有一个问题如果max指向的是最后一个位置怎么办,也需要特殊判断,这些都是后来测试的时候,调试遇到的错误 我觉得自己写慢慢查找问题是有好处的,因为我知道这个基本思路没错,那么问题就在于程序设计本身有小问题了,所以就不断调试,修改,下面是成功通过的程序,有些许冗余
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类 the head node
* @return ListNode类
*/
ListNode* sortInList(ListNode* head) {
// write code here
//冒泡排序
if(head->next==NULL)
return head;
ListNode *end=NULL;
ListNode *max=NULL;
ListNode *max_prior=NULL;
ListNode *cur_prior=NULL;
ListNode *cur=NULL;
while(head!=end)//链表尚未走完
{
max_prior=head;
cur_prior=head;
for(max=head,cur=head->next;cur!=end;)
{
if(cur->val > max->val)
{
max=cur;
max_prior=cur_prior;
}
cur_prior=cur;
cur=cur->next;
}
//找到最大的max
if(max->next==end)
end=max;
else if(max==head)
{
head=max->next;
max->next=end;
cur_prior->next=max;
end=max;
}
else
{
max_prior->next=max->next;
max->next=end;
cur_prior->next=max;
end=max;
}
}
return head;
}
};