『力扣刷题本』:链表分割

一、题目

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

二、思路解析

首先,让我们列出我们需要做的事情:

  1. 遍历整个链表;
  2. 对于值小于x的节点,把它们暂时存储起来,并从原链表中删除「删除是为了等下重新插入的时候,不造成元素重复的情况」;
  3. 最后,我们要把这些节点重新插入到链表的头部。

Sounds simple, right?

Step 1: 选择好用什么结构来存储值小于 x 的元素

这里我采用的是题解区中一位大佬的解法,他是用栈来存储那些待会要头插于链表的、值小于 x 的元素的。

我们首先定义一个栈来存储所有小于x的节点的值。

如果你对栈不熟悉,没关系,想象一下你在吃饭时堆放碗筷的样子,最后放上去的碗筷总是最先被取走,栈就是这样工作的。

Step 2: 遍历链表

遍历过程,如果我们遇到一个值小于x的节点,我们就把它的值压入栈中,并从原链表中删除这个节点。

如何删除节点,只需要把它前面节点的 next 指针指向它的下一个节点即可。

Step 3: 把栈中元素用头插法,插入链表

在我们遍历完链表后,所有小于x的节点都已经被保存在了栈中,而由于栈的先进后出特性,我们可以保证最早被删除的节点最后被添加回链表。

因此,我们从栈顶开始,每次弹出一个节点,然后创建一个新的节点,并将其添加到链表的头部。这样,我们就可以保证节点的原始顺序被保持。

这就是这道题的完整解题思路啦,下面请看完整代码~

三、完整代码

复制代码
import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here

        if(pHead == null){return null;}

        Stack<Integer> stack = new Stack<>();
        ListNode cur = pHead;
        ListNode prev = null;

        while(cur != null){
            if(cur.val < x){
                stack.add(cur.val);
                if(cur == pHead){
                    pHead = pHead.next;
                    cur = pHead;
                }else{
                    cur = cur.next;
                    prev.next = cur;
                }
            }else{
                prev = cur;
                cur = cur.next;
            }
        }
        
        while(!stack.isEmpty()){
            ListNode newNode = new ListNode(stack.pop());
            newNode.next = pHead;
            pHead = newNode;
        }
        return pHead;
    }
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

相关推荐
立心者07 小时前
SpringBoot中使用TOTP实现MFA(多因素认证)
java·spring boot·后端
枕星而眠7 小时前
C++ STL Map容器完全指南:从有序红黑树到无序哈希表
java·开发语言
geats人山人海7 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
bbq粉刷匠8 小时前
HashMap 底层原理深度拆解(二):putVal 完整链路解析(懒加载 · 链表遍历 · 尾插法)
java·开发语言·哈希算法
Sam_Deep_Thinking8 小时前
一个靠谱的C端网关服务应该包含什么内容
java·程序员·系统架构
漂流瓶jz8 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni8 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
杨运交8 小时前
[055][调度模块]Spring动态任务调度框架的设计与实现
java·后端·spring
kobesdu8 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7989 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法