以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

题目:
给定x,将链表中小于x的结点放到前面,等于大于x的结点放到后面,分割后保持原来的相对顺序不变。

思路:
1.题目中需要把小于x和大于等于x的结点划分开,那我们就创建俩个新的链表,一个用来存放小于x的结点,一个用来存放大于x的结点。
2.遍历链表,将小于x的结点尾插至less中,大于等于x的结点尾插至more中。
3.遍历结束后,如果less链表为空,直接输出great链表。如果more链表为空,直接返回less链表。
4.都不为空时,让less链表的最后一个结点的next为more的头结点。

在这里插入图片描述
注意:在连接俩个链表时,我们需要less链表的最后一个结点,所以我们需要定义一个lessLast来记录less链表的最后一个结点。more链表同理。

尾插算法:

Node cur = head;
while(cur != null){
	if(cur.val<x){
		if(less == null){
			less = cur;
		}else{
			lessLast.next = cur;
		}
		lessLast = cur;
	}else{
		if(more == null){
			more = cur;
		}else{
			moreLast.next = cur;
		}
		moresLast = cur;
	}
	cur = cur.next;
}

输出结果:

if(less == null){
	return more;
}else{
	if(more == null){
		return less;
	}
	lessLast.next = more;
}
return less;

完整程序:
https://github.com/WangWenQian12/Java_Practice/blob/master/JavaSE/IDEA/LinkedList/Partition/src/Partition.java

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值