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

目录标题

分隔链表【一分为二】

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

上代码

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,链表结束。

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

相关推荐
.ZGR.28 分钟前
蓝桥杯高校新生编程赛第二场题解——Java
java·算法·蓝桥杯
拉不动的猪37 分钟前
深入理解 JavaScript 中的静态属性、原型属性与实例属性
前端·javascript·面试
blammmp38 分钟前
算法专题十七:穷举vs暴搜vs深搜vs回溯vs剪枝
算法·机器学习·剪枝
haofafa1 小时前
高精度加减法
java·数据结构·算法
weixin_307779131 小时前
利用特征值和特征函数求解积分方程
算法
TT哇1 小时前
【BFS 解决FloodFill 算法】4. 被围绕的区域(medium)
算法·宽度优先
格林威1 小时前
AOI在人形机器人制造领域的应用
人工智能·数码相机·算法·目标跟踪·机器人·视觉检测·制造
光军oi2 小时前
面试Redis篇—————缓存穿透问题及解决策略
redis·缓存·面试