冲击大厂算法面试=>链表专题【链表简单分割】

目录标题

分隔链表【一分为二】

感觉会又有点不会!!!😢

上代码

java 复制代码
class Solution {
    /**
     * 一个链表的分区算法,该算法根据给定值 x 将链表分为两部分:一部分包含所有小于 x 的节点,另一部分包含所有大于等于 x 的节点。最终,这两部分链表被连接在一起返回
     */
    public ListNode partition(ListNode head, int x) {
        //使用虚拟头结点:使边界条件更简单,避免在处理链表头节点时的额外检查
        //preHead:作为原始链表的头结点的前驱,便于操作原链表
        ListNode preHead = new ListNode(-1);
        preHead.next = head;

        //使用 cur 遍历原链表,从 head 开始直到链表末尾
        ListNode cur = preHead;

        //双链表构造:分别构造两个链表,最后再合并,避免了在原链表上直接修改带来的复杂性
        //leftPreNode 和 rightPreNode:分别用于构建小于 x 和大于等于 x 的新链表的头结点前驱
        ListNode leftPreNode = new ListNode(-10);
        ListNode leftNode = leftPreNode;

        ListNode rightPreNode = new ListNode(-10);
        ListNode rightNode = rightPreNode;

        while (cur.next != null) {
            //节点复制:为避免改变原链表,创建了新节点进行操作,虽然牺牲了一些空间效率,但简化了逻辑
            if (cur.next.val < x) {
                leftNode.next = new ListNode(cur.next.val);
                leftNode = leftNode.next;
            } else {
                rightNode.next = new ListNode(cur.next.val);
                rightNode = rightNode.next;
            }
            cur = cur.next;
        }
        //完成遍历后,将左侧链表的尾部指向右侧链表的头部(即 rightPreNode.next),形成完整的分区后的链表
        leftNode.next = rightPreNode.next;
        //将右侧链表的尾部指向 null,确保链表正确终止。
        rightNode.next = null;

        //head没变=1->4->3->2->5->2
        //返回左侧链表的头结点(即 leftPreNode.next),因为整个分区后的链表是以左侧链表开始
        return leftPreNode.next;
    }
}

题解呀

比较简单,就是把一个链表一分为二,然后再连接

空间优化?

直接将new ListNode(cur.next.val) 改成 cur.next 就行

java 复制代码
while (cur.next != null) {
   if (cur.next.val < x) {
        leftNode.next = cur.next;
        leftNode = leftNode.next;
    } else {
        rightNode.next = cur.next;
        rightNode = rightNode.next;
    }
    cur = cur.next;
}

实在不会的时候记住

  • "小前":把小于分区值的节点放在链表的前面(less链表)。
  • "大后":把大于等于分区值的节点放在链表的后面(greater链表)。
  • "链条分开":分别处理less链表和greater链表。
  • "尾接中间":将less链表的尾部连接到greater链表的头部。
  • "结尾'无'配":确保greater链表的尾部指向null,链表结束。

有用的话就点个赞再走吧!

相关推荐
gfdhy5 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
Warren985 小时前
Python自动化测试全栈面试
服务器·网络·数据库·mysql·ubuntu·面试·职场和发展
百***06015 小时前
SpringMVC 请求参数接收
前端·javascript·算法
一个不知名程序员www6 小时前
算法学习入门---vector(C++)
c++·算法
云飞云共享云桌面6 小时前
无需配置传统电脑——智能装备工厂10个SolidWorks共享一台工作站
运维·服务器·前端·网络·算法·电脑
福尔摩斯张7 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
橘颂TA7 小时前
【剑斩OFFER】算法的暴力美学——两整数之和
算法·leetcode·职场和发展
Dream it possible!7 小时前
LeetCode 面试经典 150_二叉搜索树_二叉搜索树的最小绝对差(85_530_C++_简单)
c++·leetcode·面试
xxxxxxllllllshi7 小时前
【LeetCode Hot100----14-贪心算法(01-05),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
java·数据结构·算法·leetcode·贪心算法
前端小L8 小时前
图论专题(二十二):并查集的“逻辑审判”——判断「等式方程的可满足性」
算法·矩阵·深度优先·图论·宽度优先