86.分隔链表
难度:中等
标签:双指针
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
思路:
1.双指针的思路,一个快指针index1,用来遍历链表,一个慢指针index2,是小于x的节点的右边界,包括这个节点,如果寻找到一个新的小于x的结点,就插入到慢指针index2后面,index2后移一位,如果是大于等于x的节点,快指针就后移寻找下一个节点,如果寻找到的新的小于x的结点,就在index2后面,就不需要插入,慢指针index2和快指针index1右移
public static ListNode partition(ListNode head, int x){
ListNode index1=new ListNode(-1);
index1.next=head;
ListNode Head=index1;
ListNode index2=index1;
ListNode tmp=index1;
while(index2.next!=null){
tmp=index2.next;
if(tmp.val>=x)
index2=index2.next;
else {
if(tmp==index1.next) {
//如果比x小的元素已经在这个位置上了,两个指针右移即可
index2=index2.next;
index1=index1.next;
continue;
}
//不在位置上,先删除这个节点
index2.next=index2.next.next;
//将这个删除的结点插入到index1后面
tmp.next=index1.next;
index1.next=tmp;
//index后移
index1=tmp;
}
}
return Head.next;
}
}