程序员面试金典2.4:给定值x为基准将链表分割成两部分

2.4:编写代码,以给定值x为基准将链表分割称两部分,所有小于x的节点排在所有大于或等于x的节点之前;

解法:

要是链表换成数组,搬移元素时就要特别小心,因为搬移数组的开销很大。

不过,移动链表的元素则要容易许多。我们不必移动和交换元素,可以直接创建两个链表:一个链表存放在小于x的元素,另一个链表存放大于或等于x的元素。

我们会迭代访问整个链表,将元素插入before或after链表。一旦抵达链表末端,则表明 拆分完成,最后合并连个链表。

public Node<Integer> partition(Node<Integer> node,int x){
		if(node == null)
			return null;
		
		Node<Integer> beforeStart = null;
		Node<Integer> beforeEnd = null;
		Node<Integer> afterStart = null;
		Node<Integer> afterEnd = null;
		
		/**
		 * 分割链表
		 */
		while(node != null){
			if(node.data <x){
				//将节点插入before链表
				if(beforeStart == null){
					beforeStart = node;
					beforeEnd = beforeStart;
				}else{
					beforeEnd.next = node;
					beforeEnd = node;
				}
			}else{
				//将节点插入after链表
				if(afterStart == null){
					afterStart = node;
					afterEnd = afterStart;
				}else{
					afterEnd.next = node;
					afterEnd = node;
				}
			}
			node = node.next;
		}
		if(beforeStart == null)
			return afterStart;
		//合并before和after链表
		beforeEnd.next = afterStart;
		return beforeStart;
	}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网极客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值