题目
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
注意:你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
注意点
1、该题的思路主要是:
- 使用两个头节点分别存放小于x或者大于等于x的值;
- 使用head指针遍历目标链表;
- 使用left和right指针分别记录对应链表(小于x链表或者大于等于x链表)的结尾位置;
- 合并两个结果链表。
2、合并后记得将大于等于x的链表的下一节点置空。(因为将节点插入到链表中不只插入一个元素,而是以head为开始的链表)
参考:删除排序链表中的重复元素Ⅱ(指针+空链表实现)
实现
public ListNode partition(ListNode head, int x) {
ListNode lHead = new ListNode(-1); //小于x链表的头节点
ListNode left = lHead; //小于x链表的头指针
ListNode rHead = new ListNode(-1); //大于等于x链表的头节点
ListNode right = rHead; //大于等于x链表的头指针
//遍历目标链表
while (head != null){
//如果小于目标值
if (head.val < x){
//添加到小于x链表中
left.next = head;
//指针后移
left = left.next;
//如果大于等于目标值
}else {
//添加到大于等于x链表中
right.next = head;
//指针后移
right = right.next;
}
//指针后移
head = head.next;
}
//拼接为结果数组
left.next = rHead.next;
//将大于等于x链表的下一节点置空
right.next = null;
return lHead.next;
}