给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2 输出:[1,2]
提示:
- 链表中节点的数目在范围
[0, 200]
内 -100 <= Node.val <= 100
-200 <= x <= 200
总体思路就是遍历用两个游标就是指针,一个backup用来插入剔除的元素,result用来遍历顺便剔除元素
class Solution {
public ListNode partition(ListNode head, int x) {
if(head == null) return null;
ListNode result = new ListNode();
ListNode back = result;
result.next = head;
//用作头节点的插入
ListNode backup = result;
//我的思路是先遍历筛选出小于x的节点,然后记录,采用头插法给插入
while(true) {
if(result.next.val < x) {
//先把小于x的这个数给剔除 考虑是不是第一位 如果在第一位就不剔除了
if (result == backup) {
backup = backup.next;
result = result.next;
if (result.next == null) break;
}else {
ListNode temp = result.next; //1,4,3,2,5,2
result.next = result.next.next;
//如果提取出来后result.next为空 进行一个判断 如果backup和result相同就复原完结束循环
if (result.next == null && backup == result) {
temp.next = backup.next;
backup.next = temp;
backup = backup.next;
break;
}
temp.next = backup.next;
backup.next = temp;
backup = backup.next;
if (result.next == null) break;
}
} else {
result = result.next;
if (result.next == null) break;
}
}
return back.next;
}
}