程序员面试金典2.4:给定值x为基准将链表分割成两部分
2015-09-02 14:54
591 查看
2.4:编写代码,以给定值x为基准将链表分割称两部分,所有小于x的节点排在所有大于或等于x的节点之前;
解法:
要是链表换成数组,搬移元素时就要特别小心,因为搬移数组的开销很大。
不过,移动链表的元素则要容易许多。我们不必移动和交换元素,可以直接创建两个链表:一个链表存放在小于x的元素,另一个链表存放大于或等于x的元素。
我们会迭代访问整个链表,将元素插入before或after链表。一旦抵达链表末端,则表明 拆分完成,最后合并连个链表。
解法:
要是链表换成数组,搬移元素时就要特别小心,因为搬移数组的开销很大。
不过,移动链表的元素则要容易许多。我们不必移动和交换元素,可以直接创建两个链表:一个链表存放在小于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; }
相关文章推荐
- 黑马程序员----------Java基础------------Collections和Arrays
- 黑马程序员——Java之Thread类
- 黑马程序员——集合框架(单列集合:Collection接口)
- 备战阿里面试!
- 程序员博客是否应该晒代码(由摄影而感)
- java面试总结2
- Java面试总结1
- Java面试总结1
- 程序员什么时候该考虑辞职
- 一篇让你知道程序员和黑客区别的文章
- 程序员什么时候该考虑辞职
- 一篇让你知道程序员和黑客区别的文章
- 面试题总结
- 黑马程序员-------Java基础-------集合之Map
- 黑马程序员-------Java基础-------集合
- 程序员接私活经验谈[转]
- 一个程序员的基本素质
- 程序员的自我修养笔记之简介(一)
- 黑马程序员42,基本数据操作流,字节数组操作流,转换流,编码表
- 腾讯面试准备