题目
给定一个单向链表头节点head,和一个整数pivot。
实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的。调整后的节点顺序要保持与原链表中节点的先后次序一致。
进阶问题要求时间复杂度仍然为O(N), 额外空间复杂度为O(1)。
思路
进阶解法具体过程如下:
1、将原链表中的所有节点依次分为三个链表,small,equal和big。
链表7->9->1->8->5->2->5, pivot=5 |
small: 1->2->null |
equal: 5->5->null |
big: 7->9->8->null |
2、将三个链表重新串起来即可
3、整个过程需要注意对null节点的判断和处理。
源码
public class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public Node listPartition2(Node head,int pivot){
Node sH=null;//小的头
Node sT=null;//小的尾
Node eH=null;//中的头
Node eT=null;//中的尾
Node bH=null;//大的头
Node bT=null;//小大的尾
Node next=null;//保存下一个节点
//所有的节点分进三个链表
while(head!=null){
next=head.next;
head.next=null;
if(head.value<pivot){
if(sH=null){
sH=head;
sT=head;
}else{
sT.next=head;
sT=head;
}
}else if(head.value==pivot){
if(eH=null){
eH=head;
eT=head;
}else{
eT.next=head;
eT=head;
}
}else{
if(bH=null){
bH=head;
bT=head;
}else{
bT.next=head;
bT=head;
}
}
head=next;
}
//小的和相等的重新连接
if(sT!=null){
sT.next=eH;
eT=eT==null?sT:eT;
}
//所有的重新连接
if(eT!=null){
eT.next=bH;
}
return sH!=null?sH:eH!=null?eH:bH
}