将单链表按某值划分成左边小,中间相等,右边大的形式
- 普通方法,将链表节点放到数组然后partition
- 进阶方法,将链表划分成三个子链表,然后合并
普通方法,将链表节点放到数组然后partition
这个方法比较简单,直接将链表中的值保存到一个数组中,然后按照荷兰国旗的划分方式,将数组划分成左边小于那个数,中间等于那个数,右边大于那个数的形式,(荷兰国旗问题用于快速排序中的
partition
过程);划分完之后,再把数组中的值用链表的形式连接起来。 但是这个方法需要额外的
O(n)
的空间复杂度,而且partition
不能达到稳定性(就是会改变原来的相对顺序);
1 | static class Node { |
进阶方法,将链表划分成三个子链表,然后合并
- 这个方法是将原来的链表依次划分成三个链表,三个链表分别为
small
代表的是左边小于的部分,equal
代表的是中间相等的部分,big
代表的是右边的大于部分; - 这三个链表都有自己的两个指针
Head
和Tail
分别代表各自的头部和尾部,分成三个子链表之后,我们只需要遍历链表,然后和给定的值比较,按照条件,向三个链表中添加值就可以了,最后把三个链表连接起来就可以了;
但是,这个题目要注意一些边界条件。具体看下图:
代码如下
1 | //第二种 进阶的方法 不需要额外的空间复杂度,且能达到稳定性 |
最后贴上测试完整代码
1 | /** |
测试结果