题目
给定一个单向链表的头节点head,节点的值类型是整形,再给定一个整数privot。实现一个调整链表的函数,将链表调整为左部分都是小于privot的节点,中间部分都是值等于privot的节点,右部分都是值大于privot的节点。
如果链表的长度为N,时间复杂度请达到O(N)。
进阶
在原问题的要求之上再增加如下两个要求:
- 在左、中、右三个部分的内部也做顺序要求,要求每部分里的节点从左到右的顺序与原链表中节点的先后次序一致。
- 如果链表的长度为N,额外空间复杂度请达到O(1)
代码实现
public class ListPartition {
//普通解法 额外空间复杂度O(N)
public Node listPartition1(Node head, int privot) {
if (head == null) {
return head;
}
Node cur = head;
int i = 0;
while (cur != null) {
i++;
cur = cur.next;
}
Node[] nodeArr = new Node[i];
i = 0;
cur = head;
for (i = 0; i < nodeArr.length; i++) {
nodeArr[i] = cur;
cur = cur.next;
}
arrPartition1(nodeArr, privot);
// arrPartition2(nodeArr, privot);
for (i = 1; i < nodeArr.length; i++) {
nodeArr[i - 1].next = nodeArr[i]