大家好,我是青空。
快来和青空看看今天的Java每日一题吧
题目
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。
解法预警
不建议直接看下面答案,可以自己先思考一下怎么处理再看答案比较合适
解法
要是链表换作数组,搬移元素时就要特别小心,因为搬移数组元素的开销很大。
不过,移动链表的元素则要容易许多。我们不必移动和交换元素,可以直接创建两个链表: 一个链表存放小于x的元素;另一个链表存放大于或等于x的元素。
我们会迭代访问整个链表,将元素插入before或after链表。一旦抵达链表末端,则表明拆分完成,最后合并两个链表。
public static LinkedListNode partition(LinkedListNode node, int x) {
LinkedListNode beforeStart = null;
LinkedListNode beforeEnd = null;
LinkedListNode afterStart = null;
LinkedListNode afterEnd = null;
/* Partition list */
while (node != null) {
LinkedListNode next = node.next;
node.next = null;
if (node.data < x) {
if (beforeStart == null) {
beforeStart = node;
beforeEnd = beforeStart;
} else {
beforeEnd.next = node;
beforeEnd = node;
}
} else {
if (afterStart == null) {
afterStart = node;
afterEnd = afterStart;
} else {
afterEnd.next = node;
afterEnd = node;
}
}
node = next;
}
/* Merge before list and after list */
if (beforeStart == null) {
return afterStart;
}
beforeEnd.next = afterStart;
return beforeStart;
}