概览
上面一篇文章讲解了数组快速排序的实现,由于单向链表与数组天生差异,无法实现从后往前的指针遍历,所以考虑换一种方式来实现。
实现原理
既然不能从后往前进行指针遍历,那么就从前往后吧。同样的设定基准值pivot为链表的头结点的值,两个指针S(Small)和L(Large)分别指向头结点和头结点的next结点。我们的目标是保证S指针之前的元素都小于等于pivot,而S指针与L指针之间的数据都大与pivot,直到L指针指向最后一个结点。
判断L指向的结点的值是否大于pivot,如果否,则将S指针往后移动一个位置(我们一开始的目标就是S指针之前的结点值小于等于pivot,那么往后移动一个位置后的结点值必然大于pivot),交换S指针与L指针指向的结点的值,然后L指针往后移动;如果是,则只往后移动L指针,保持S指针不动。
不断进行以上操作,直到L指针指向链表最后一个结点。这时S指针之前(包括S指针指向的结点)的结点的值都小于等于pivot(不包括头结点,即设置pivot的结点),S指针和L指针之间的结点的值都大于pivot,然后交换S指针指向结点与头结点的值,完成一次排序。
再分别对(头结点-->Small