[路飞]_算法_链表_分隔链表

271 阅读1分钟

题目描述

给你一个链表的头节点 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&&current.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;

};