【牛客网算法课】—— 将单向链表按某值划分成左边小、 中间相等、 右边大的形式

给定一个整数pivot,此博客介绍如何调整单向链表,使值小于pivot的节点位于左侧,等于pivot的居中,大于pivot的位于右侧,同时保持各部分内部顺序与原链表一致。题目要求时间复杂度为O(N),额外空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

【 题目】 给定一个单向链表的头节点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; 中间部分在本例中为空, 不再讨论; 右部分节点 从左到右为9、 4、 5。 在原链表中也是先出现9, 然后出现4,最后出现5。

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


public class Code_12_SmallerEqualBigger {
   
   

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

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

	public static 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.<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值