【Java实现】链表分割

简介: 【Java实现】链表分割

题目入口📌:链表分割

问题描述

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

解题分析

      本题比较难理解,我画图来向大家分析。如下图,规定 x = 10,定义一个cur变量且cur 指向链表首部,当cur遍历一次链表,同时把小于10的结点放在 before 链表中,其余的放在 after 链表中。(动图做的有点粗糙,请大家原谅😂)

在图中我们发现,在 before 中,8 比 6 大,但是8 排在 6 的前面是因为在原链表中,8 就排在 6 的前面,这就是题目中不能改变原来的数据顺序的意思。

而图中的 before 和 after 链表都是虚构的,那我们写代码时该如何实现呢?

 我们来拿 before 链表 实现来说,我们可以创建两个结点 bs 和 be 来分别表示 before 链表的头和尾,初始化置为空。

创建bs 作用:方便我们找到 before 链表

创建be 作用:方便我们在 before 链表中添加结点

当cur指向结点值小于x,这时如果 bs 和 be 都为空时,那就把cur赋值给bs 和 be。

如果 bs 和 be 都不为空,那么就把cur赋值给 be.next,然后be向后移【be = be.next】

if(bs == null && be == null){//说明before链表中没有元素
    bs = cur;
    be = be;
}else{
    be.next = cur;
    be = be.next;//也可以写成be = cur;
}

对 after 链表来说,我们也要创建两个结点 as 和 ae,分别指向 after 链表的头和尾。


这一部分具体代码如下

while(cur != null){
            if(cur.val < x){ //小于x 则进入 before 链表
                if(bs ==null){
                    bs = cur;
                    be = bs;
                }else{
                    be.next = cur;
                    be = be.next;
                }
            }else{ //其他情况 则进入 after 链表
                if(as ==null){
                    as = cur;
                    ae = as;
                }else{
                    ae.next = cur;
                    ae = cur;
                }
            }
            cur = cur.next;
        }

最后我要把 before 链表 和 after 链表 合并,同时把ae.next 置为null。

be.next = as;
ae.next = null;

到这还没结束,我们还少考虑两种情况


1、after 链表为空

如下图,当 after 链表为空时,我们可以直接返回 bs 。而如果我们让编译器继续执行 ae.next = null 语句那么就会报出空指针异常。

4aee0df10f3c0ba7c433714e9e08e00d_0d471a4db410432c86384ae5b91d9eb5.png

2、before 链表空

如下图,当 before 链表为空时,也不需要执行 be.next = as 语句 ,直接返会 as 即可。

d584bf57421497b3c2f255fa07b80ad4_0b575a685dff4639a54eab95f62c7680.png


代码实现

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        if(pHead == null) return null;                                                                                         
        ListNode bs = null;
        ListNode be = null;
        ListNode as = null;
        ListNode ae = null;
        ListNode cur = pHead;
        while(cur != null){
            if(cur.val < x){
                if(bs ==null){
                    bs = cur;
                    be = bs;
                }else{
                    be.next = cur;
                    be = be.next;
                }
            }else{
                if(as ==null){
                    as = cur;
                    ae = as;
                }else{
                    ae.next = cur;
                    ae = cur;
                }
            }
            cur = cur.next;
        }
        if(bs == null){
            return as;
        }
        if(as == null){
            return bs;
        }
        be.next = as;
        ae.next = null;
        return bs;
    }
}


相关文章
|
3月前
|
IDE Java 编译器
使用Java分割PDF文件
使用Java分割PDF文件
|
1天前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
1月前
|
存储 Java
|
1月前
|
Java
Java系列之:字符串的截取及分割 split() 和 substring()
这篇文章通过示例代码讲解了Java中字符串的截取和分割操作,包括使用`split()`方法根据正则表达式进行字符串分割以及使用`substring()`方法进行字符串截取的不同使用方式及其输出结果。
Java系列之:字符串的截取及分割 split() 和 substring()
|
1月前
|
存储 Java
java实现单链表的创建、增、删、改、查
这篇文章详细介绍了Java中如何实现单链表的创建以及对单链表进行增加、删除、修改、查询等操作的方法,并提供了相应的代码示例。
java实现单链表的创建、增、删、改、查
|
1月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
58 0
|
1月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
1月前
|
存储 Java
java实现双向链表的增删改查
这篇文章展示了如何在Java中实现双向链表的增加、删除、修改和查询操作,并通过代码示例演示了在双向链表中存储和操作学生信息的过程。
|
1月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
44 0
|
1月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
19 0