题目
给你一个链表的头节点 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
解题思路
1.我们可以用哨兵的思想来解决这个问题,首先我们设置一个存放大于 x 的链表 big 和一个存放小于 x 的链表 small,并设置一个 big 的头指针 bighead 和一个 small 的头指针 smallhead ,以及我们的哨兵 cur 指针
2.我们让 cur 指针指向表头,开始进行遍历,并且与 x 进行比较,若大于等于 x 则放入big链表,若小于 x 则放入 small 链表,
3.遍历结束后,我们将 big 链表连接在 small 链表之后,并将 big.next 置为 null,否则会出现环。
代码实现
class Solution {
public ListNode partition(ListNode head, int x) {
if(head == null){
return head;
}
ListNode big = new ListNode(0);
ListNode small = new ListNode(0);
ListNode bighead = big;
ListNode smallhead = small;
ListNode cur = head;
while(cur != null){
if(cur.val >= x){
big.next = cur;
big = big.next;
}else{
small.next = cur;
small = small.next;
}
cur = cur.next;
}
small.next = bighead.next;
big.next = null;
return smallhead.next;
}
}
测试结果