题目描述
给你一个链表的头节点 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
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 整体上:创建新链表,遍历原链表,大于等于x的项往新链表后面插入,小于x的项往新链表前面放。
- 细节上:往前面插的时候需要遵循先插入的在前面的原则,所以,往前插入的时候,需要找到新链表中最后一个小于x的节点和大于等于x的临界点,然后插入到两个点的中间,如果找到链表末都没找到临界点,则直接插到新链表的最后
代码
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
// 思路:
// 整体上:创建新链表,遍历原链表,大于等于x的项往新链表后面插入,小于x的项往新链表前面放
// 细节上:往前面插的时候需要遵循先插入的在前面的原则,所以,往前插入的时候,需要找到新链表中最后一个小于x的节点和大于等于x的临界点,然后插入到两个点的中间,如果找到链表末都没找到临界点,则直接插到新链表的最后
/**
* @param {ListNode} head
* @param {number} x
* @return {ListNode}
*/
var partition = function(head, x) {
let nowHead=head;
let newHead=new ListNode(-201);//创建一个一定比x小的头部节点
while(nowHead){
let newNode=new ListNode(nowHead.val);//创建一个虚拟节点在头部,
let current;
if(newHead&&nowHead.val<x){
//判断val小于3的,加入新链表大于等于3的那个节点前,没有大于等于3的节点就添加到最后
current=newHead;
let parent=current;
while (current.val<x&¤t.next){//遍历新连表,寻找插入位置,找到大于等于x,或者链表链表的末尾都是插入的位置
parent=current;
current=current.next;
}
if(current.val>=x){//找到大于等于x的项,则插入该项的前面
newNode.next=parent.next;
parent.next=newNode;
}else{//找到链表的末尾还没找到大于等于x的项,则插入到新链表末尾
let child=current.next;
newNode.next=child;
current.next=newNode;
}
}else{
//其他情况往新链表后面添加 (包括第一个节点的情况和>=x的情况)
current=newHead;
while(current.next){
current=current.next;
}
current.next=newNode;
}
nowHead=nowHead.next;
}
return newHead.next;
};