【路飞】分隔链表

218 阅读1分钟

记录一道算法题

分隔链表

86. 分隔链表 - 力扣(LeetCode) (leetcode-cn.com)


要求:

    * 小于x的节点放左边,大于等于x的节点放右边
    * 保持原来节点之间的相对位置

至少也要遍历链表一次的,问题是如何处理节点的衔接。 这里提到了一个伪节点的概念,新创建一个节点作为开头,可以不用做if判断初始化开头节点。

实际上不用考虑节点之间的旧联系,因为会随着节点的赋值而重置。只需要等分区后衔接两个区域的边缘就可以了

    function partition(head, x) {
        const before = new ListNode()
        const after = new ListNode()
    
        // 指针
        let minStart = before
        let maxStart = after

        // 遍历
        while(head) {
            if (head.val < x) {
                minStart = minStart.next = head
            } else {
                maxStart = maxStart.next = head
            }

            head = head.next
        }
        
        // 当没有小于x或者大于等于x的节点的时候,用另一个的开头
        if (before.next == null) {
            head = after.next
        } else {
            head = before.next
        }

        // 首尾衔接,并且清除尾巴
        // 值得注意的是,当没有小于x的节点的时候,minStart赋值做不做都行
        minStart.next = after.next
        maxStart.next = null

        return head
    };