因为链表不能像数组一样用下标访问,而只能用next访问,所以我们只能用next做文章了。
考虑下面两种方案:
1.从前往后遍历交换。
2.从后往前遍历交换
对于方案1,比如我们要对2, 3,1, 4做一个升序,当我们遍历到1时,可以交换1和3,交换后顺序为2,1,3,4,但因为没有一个向前的指针,导致我们无法完成2和1的交换,除非我们从头开始做第二次遍历才能完成2和1的交换,这显然就太复杂了。这样来看,每个数最多只能向前移动一步,这样就很麻烦,。
对于方案2,我们可以通过递归至最后一个节点,然后往前,考虑2,1,6,3,5,4,遍历到4时返回,此时head指向5,交换4和5,交换后的顺序为2,1,6,3,4,5,这步肯定没问题。当我们遍历到6这个节点时,交换6和3,但因为6最大,肯定 还需要往后面移动,这里利用whlie循环,而且可以通过next遍历比较至最后。
总的来说,因为链表的限制,我们只能用next指针。而通过递归,在将后面节点排序好之后,我们是可以返回前一个节点的,这样我们就可以将某个节点只与后面的比较,而不用与前面的比较了,这就是通过从后往前遍历实现的。
static void list_sort(struct node *head)//递归调用
{
//TODO:
if(head==NULL||head->next==NULL) return;//因为需要做数值比较,我们在最后一个有值的节点返回
list_sort(head->next);
node* t_head=head;//用一个临时指针去遍历,保证head位置不变
while(t_head->next!=NULL && (t_head->val)>(t_head->next->val))
{
int temp = t_head->val;
t_head->val=t_head->next->val;
t_head->next->val=temp;
t_head=t_head->next;
}
}