给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
解题思路:工作指针p和q,p指向已经分隔好的小于特定值x的最后一个节点,q指向当前正在处理的节点的前一个节点(如果节点i的值小于x,需要将节点摘掉链到p的后面,需要节点i的前一个节点,因此q指向当前正在处理节点的前一个节点)
另外,为了方便处理当前头节点(因为q要指向正在处理节点的前一节点),new一个工作节点p指向头节点(p.next = head;head = p),从q = head开始处理
Java代码:
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode p = new ListNode(0x3f3f3f3f), tmp = null;
ListNode q = p;
p.next = head;
head = p;
while(null != q && null != q.next){
if(q.next.val < x){
if(q == p) {
p = p.next;
q = q.next;
} else {
tmp = q.next;
q.next = q.next.next;
tmp.next = p.next;
p.next = tmp;
p = p.next;
}
} else {
q = q.next;
}
}
return head.next;
}
}