将单向链表按某值划分为左边小,中间相等,右边大的形式
题目:
给定一个单项链表的头结点head,节点的值类型时整形,再给定一个整数pivot。实现一个调整链表的函数,左半部分小于pivot,中间部分等于,右半部分大于。但是对于调整后的节点顺序没有更多的要求
例如:
9->0->4->5->1,pivot=3
结果可以为1->0->4->9->5,也可以为0->1->9->5->4
思路:
方法1:
可以用辅助数组的方法,将链表中的所有元素放入数组中,然后对数组运用荷兰国旗问题的求解方法,再将处理完的数据放回到链表中。这种方式简单有效,推荐在上机时快速得出正确答案。但是荷兰国旗问题一方面不稳定,还需要辅助数组,所以面试时不建议这么回答。
方法2:
使用6个指针,分别为小于区域的首尾指针,等于区域的首尾指针,大于区域的首尾指针,第一次遍历列表,将小于区域的指针指向第一个出现的小于pivot的,将等于区域的指针指向第一个出现的等于pivot的结点,大于同样如此,然后再遍历链表,将遇到的小于pivot的节点链接在小于区域的尾节点后,等于,大于区域同样如此,最后再将小于,等于,大于区域连接起来。