给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
不需要 保留 每个分区中各节点的初始相对位置。
public ListNode partition(ListNode head,int x){
//创建small和big两个小链表的虚拟头结点
ListNode smallHead = new ListNode(-1);
ListNode bigHead = new ListNode(-1);
//按照升序插入,因此需要尾插
//分别指向两个子链表的尾部
ListNode smallTail = smallHead;
ListNode bigTail = bigHead;
//遍历原链表,根据值将结点依次放在两个子链表中
while(head != null){
//值小于x。放在small链表中
if(head.val < x){
smallTail.next = head;
smallTail = head;
}else{
//值大于x。放在big链表中
bigTail.next = head;
bigTail = head;
}
head = head.next;
}
bigTail.next = null;
//拼接小链表与大链表
smallTail.next = bigHead.next;
return smallHead.next;
}