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;
}