链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶)

题目

给定一个单向链表头节点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

}

 

 

 

发布了43 篇原创文章 · 获赞 21 · 访问量 4911

猜你喜欢

转载自blog.csdn.net/flying_1314/article/details/103875584