您的位置:首页 > 职场人生

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

2015-09-02 14:54 591 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: