基础解:荷兰国旗问题(笔试时可用,简单直接,但不稳定)
将所有的节点遍历得到链表的长度,再遍历一次将所有节点放置到一个数组中,对这个数组进行partition调整(荷兰国旗问题),再将每个数组中每个节点串起来即可。
进阶解:按照原链表各个节点的对应顺序将链表调整成三部分,小于num的、等于num的,大于num的,之后再将三个连起来即可。
代码如下:
#coding=utf-8
'''
将单向链表按某值划分成左边小、 中间相等、 右边大的形式
【 题目】 给定一个单向链表的头节点head, 节点的值类型是整型, 再给定一个
整 数pivot。 实现一个调整链表的函数, 将链表调整为左部分都是值小于 pivot
的节点, 中间部分都是值等于pivot的节点, 右部分都是值大于 pivot的节点。
除这个要求外, 对调整后的节点顺序没有更多的要求。 例如: 链表9->0->4->5-
>1, pivot=3。 调整后链表可以是1->0->4->9->5, 也可以是0->1->9->5->4。 总
之, 满 足左部分都是小于3的节点, 中间部分都是等于3的节点(本例中这个部
分为空) , 右部分都是大于3的节点即可。 对某部分内部的节点顺序不做 要求。
进阶: 在原问题的要求之上再增加如下两个要求。
在左、 中、 右三个部分的内部也做顺序要求, 要求每部分里的节点从左 到右的
顺序与原链表中节点的先后次序一致。 例如: 链表9->0->4->5->1, pivot=3。
调整后的链表是0->1->9->4->5。 在满足原问题要求的同时, 左部分节点从左到
右为0、 1。 在原链表中也 是先出现0, 后出现1; 中间部分在本例中为空, 不再
讨论ÿ