每日一题之分割链表

![在这里插入图片描述](https://img-在这里插入图片描述
blog.csdnimg.cn/6b961d2814414fa1924f6b2f040cd339.png)

解题思路

  • 找到第一个大于等于x的节点staticNode,之后所有小于x的非法节点都会插入该节点之前
  • 判断staticNode之前是否存在小于x的合法节点。有则将最靠近staticNode的节点设置为vaildNode。没有则为null
  • 双指针遍历链表,从vaildNode开始遍历。找出非法节点,插入validNode之后。同时validNode = validNode.next;
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function partition(head: ListNode | null, x: number): ListNode | null {
    if(!head) return null;

    let res = head;

    // 找到第一个大于等于x的节点
    let staticNode = head;
    while (staticNode && staticNode.val < x) {
        staticNode = staticNode.next;
    }
    if(!staticNode) return head;

    // 找到第一个合法节点
    let validNode = head.val < staticNode.val ? head : null;

    if (validNode !== null) {
        res = validNode;
        while (validNode.next && validNode.next.val < staticNode.val) {
            validNode = validNode.next;

            if (validNode.next.val >= staticNode.val) {
                break;
            }
        }
    }

    // 找到合法的节点
    let current = head,
        pre = head.next;
    main: while (true) {

        if (validNode) {
            current = validNode;
            pre = validNode.next;
            
        }

        if(!pre) break;

        while (pre.val >= x) {
            pre = pre.next;
            current = current.next;
            if (!pre) {
                break main;
            }
            if (pre.val < x) {
                break;
            }
        }

        if (validNode) {
            current.next = pre.next;
            pre.next = validNode.next;
            validNode.next = pre;
            validNode = validNode.next
        } else {
            current.next = pre.next;
            pre.next = staticNode;
            res = pre;
            validNode = pre;
        }
    }

    return res;
}; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C每日一练中的环形链表Ⅱ问题是指LeetCode刷题专栏中的第142题。该问题的目标是找到给定链表中的环的入口节点。解决这个问题的一种常用方法是使用快慢指针。 快慢指针解法中,快指针的步数是慢指针的两倍,即慢指针一次走一步,快指针一次走两步。两个指针从链表的起始位置开始运行,如果链表中存在环,则快指针最终会追上慢指针,二者会在环中相遇。如果链表不带环,则快指针会率先走到链表的末尾。这种思路可以通过在纸上画图来更好地理解。 在解决环形链表Ⅱ问题时,我们可以按照以下步骤进行操作: 1. 定义快慢指针,初始时都指向链表的头节点。 2. 快指针一次走两步,慢指针一次走一步,直到两个指针相遇或快指针到达链表末尾。 3. 如果快指针到达链表末尾,则说明链表中没有环,直接返回null。 4. 如果快慢指针相遇,则说明链表中存在环。 5. 重新定义一个指针,从链表的头节点开始,与慢指针同时移动,每次移动一步,直到两个指针再次相遇。 6. 当两个指针再次相遇时,它们所指向的节点就是环的入口节点。 通过以上步骤,我们可以找到给定链表中环的入口节点。注意,在实际编码中,需要考虑边界条件和特殊情况的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【LeetCode】每日一题链表部分经典题型](https://blog.csdn.net/qq_63320529/article/details/130697933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值