一分钟解决数据结构问题----分割链表

此题为力扣链表题目:

📌 文章目录:

1️⃣.题目解析

2️⃣.代码实现

3️⃣.全部代码

题目:👇

在这里插入图片描述

1️⃣.题目解析

题目给定一个数字(比如10)要求比 10 小的数字都出现在大于等于 10 的数值前,这个数值(10)不一定出现在链表中,要求不能改变原来链表的相邻结点的初始相对位置,即初始时如果一个结点在另一个的右边(或者左边)移动后必须还是保持在其右边(或者左边)顺序不可以改变,这道题运用到需要运用到四个指针,运用分别记录位于给定数数值前的开始位置的:bs ,记录位于给定数数值前的结束位置的:be,记录位于给定数数值后的开始位置的:as,记录位于给定数数值后的结束位置的:ae,还有一个运用遍历链表的 cur ,进入循环先判断结点数值与给定数值的大小,再判断是不是第一次插入,结束循环后,分别判断前后两个位置是不是都有元素的插入

2️⃣.代码实现

步骤一、定义四个结点类型变量

ListNode bs = null;
ListNode be = null;
ListNode as = null;
ListNode ae = null;

步骤二、定义一个 cur 用于遍历数组

ListNode cur = head;

步骤三、进入循环进行数值大小的比较,如果是第一次插入元素,两个指针都指向该结点,如果不是第一次插入就执行插入操作,把满足要求的结点插入进来,循环结束条件为 cur 为空,即遍历完整个链表

if (cur.val < x){
                if (bs == null){
                    be = cur;
                    bs = cur;
                }
                else{
                    be.next = cur;
                    be = be.next;
                }
            }
            else{
                if (as == null){
                    ae = cur;
                    as = cur;
                }
                else{
                    ae.next = cur;
                    ae = ae.next;
                }
            }
            cur = cur.next;
        }

在这里插入图片描述

步骤四、判断两个位置是不是都有结点,如果前面的位置没有元素,就把后半段的起始位置返回即(as),如果前半段有结点就,把前半部分和后半部分链接起来,再判断后半部分有没有结点,如果有就把后半部分的结束位置置空

if (bs == null){
            return as;
        }
        be.next = as;
        if (as != null){
            ae.next = null;
        }

在这里插入图片描述

步骤五、返回前半部分的起始位置

return bs;

3️⃣.全部代码

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦の澜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值