[链表] - 将单向链表按某值划分成左边小、中间相等、右边大的形式

题目:
给定一个单向链表的头结点head,节点的值类型时整型,再给定一个整数pivot
实现一个调整链表的函数,将链表调整为左部分都是小于pivot的节点,中间部分
都是值等于pivot的节点,右边部分都是大于pivot的节点,出这个要求外,对调整后的
节点顺序没有更多的要求
进阶:
-在原问题的要求智商再增加如下两个要求:
在左中右三个部分的内部也做顺序要求,要求每部分的节点从左到右顺序与
原链表中节点的先后顺序一致。

-如果链表长度为N,时间复杂度达到O(N),额外空间复杂度请达到O(1)

public class Node{
	public int value;
	public Node next;

	public Node(int dta){
		this.value = data;
	}
}

public Node listPartition1(Node head,int pivot){
	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;
	}
	arrPartition(nodeArr,pivot);
	for(i = 1;i != nodeArr.length; i++){
		nodeArr[i -1].next = nodeArr[i];
	}
	nodeArr[i-1].next = null;
	return nodeArr[0];
}	

public void arrPartition(Node[] nodeArr,int pivot){
	int small = -1;
	int big = nodeArr.length;
	int indedx = 0;
	while(index != big){
		if(nodeArr[index].value < pivot){
			swap(nodeArr,++small,index++);
		}else if (nodeArr[index].value == pivot){
			index ++;
		}else{
			swap(nodeArr,--big,index);
		}
	}
}

public void swap(Node[] nodeArr, int a, int b){
	Node tmp = nodeArr[a];
	nodeArr[a] = nodeArr[b];
	nodeArr[b] = tmp;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值