题目描述:
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的 节点之前。
注意:
1、分割后的链表不一定是有序的,只要以 x 为界限,小于 x 的在前,大于或者等于 x 的在后即可
2、若链表中出现 x ,不用进行特殊处理,只要排在小于 x 的元素后面即可
示例:
思路:
以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的 节点之前,可以分情况讨论:
1、若链表为空,直接返回 null;
2、若链表只有一个结点,直接返回head;
3、若为一般情况,先重建两个链表 smallList 和 bigList 分别用于存放小于以 x 和大于 x 的元素;在原链表不为空(head != null)的情况下,将原链表中的元素按照大小分别插入到链表 smallList 和 bigList 中,最后再把 bigList 连接到 smallList 后即可
代码:
/**
* Definition for singly-linked list.
* public class Node {
* int val;
* Node next;
* Node(int x) { val = x; }
* }
*/
//以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
public Node partition(int x) {
if(head == null){
return null;
}
if(head.next == null){
return head;
}
Node smallHead = new Node(0);
Node bigHead = new Node(0);
Node l1 = smallHead;
Node l2 = bigHead;
while (head != null) {
if (head.value < x) {
l1.next = head;
head = head.next;
l1 = l1.next;
l1.next = null;
} else {
l2.next = head;
head = head.next;
l2 = l2.next;
l2.next = null;
}
}
l1.next = bigHead.next;
return smallHead.next;
}