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

目录标题

分隔链表【一分为二】

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

上代码

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

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

相关推荐
Dontla1 小时前
Rust泛型系统类型推导原理(Rust类型推导、泛型类型推导、泛型推导)为什么在某些情况必须手动添加泛型特征约束?(泛型trait约束)
开发语言·算法·rust
Ttang231 小时前
Leetcode:118. 杨辉三角——Java数学法求解
算法·leetcode
喜欢打篮球的普通人1 小时前
rust模式和匹配
java·算法·rust
java小吕布1 小时前
Java中的排序算法:探索与比较
java·后端·算法·排序算法
win x2 小时前
链表(Linkedlist)
数据结构·链表
杜若南星2 小时前
保研考研机试攻略(满分篇):第二章——满分之路上(1)
数据结构·c++·经验分享·笔记·考研·算法·贪心算法
路遇晚风2 小时前
力扣=Mysql-3322- 英超积分榜排名 III(中等)
mysql·算法·leetcode·职场和发展
Neophyte06082 小时前
C++算法练习-day40——617.合并二叉树
开发语言·c++·算法
木向2 小时前
leetcode104:二叉树的最大深度
算法·leetcode