对链表进行分区

2024-03-25

我正在尝试基于链表数据结构来解决这个算法问题。问题如下:

给定一个链表和一个值 x,对其进行分区,使得所有小于 x 的节点都位于大于或等于 x 的节点之前。 您应该保留两个分区中节点的原始相对顺序。

例如,

给定 1->4->3->2->5->2 且 x = 3, 返回 1->2->2->4->3->5。

我的问题解决方案是:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode partition(ListNode head, int x) {
        if(head == null) return null;
        ListNode headNode = new ListNode(-1);
        headNode.next = head;

        ListNode tail = head;
        while(tail.next!=null){
            tail = tail.next;
        }
        ListNode actualTail = tail;
        ListNode current = headNode;
        while(current!=actualTail && current.next!=actualTail){
            if(current.next.val >= x && current.next!=tail){
                System.out.println("Moving "+current.next.val+" to end of list, ahead of "+tail.val);
                ListNode temp = current.next;
                current.next = current.next.next;
                tail.next = temp;
                tail = tail.next;
                tail.next = null;
            }else{
                current = current.next;    
            }

        }
        return headNode.next;
    }
}

虽然某些测试用例可以很好地使用此代码(例如上面提到的代码),但有一组测试用例失败,因为我无法维护列表中节点的原始相对顺序。

例如: 列表 = [1->2] x = 0

我的结果: [2,1]

预期的: [1,2]

任何帮助将不胜感激。


我认为你可以用更简单的方式做到这一点:

  • 保留 2 个列表,一个用于较低节点,另一个用于较大节点。
  • 迭代列表,将节点添加到相应的列表中。
  • 将较低的列表与较大的列表连接起来

像这样的事情:

public ListNode Partition(ListNode head, int x)
{
    ListNode lowerHead = null, lowerTail = null;              //Head and Tail of lower list
    ListNode greaterHead = null, greaterTail = null;          //Head and Tail of greater list

    ListNode current = head;

    while (current != null)
    {
        if (current.val < x)
        {
            if (lowerHead == null) lowerHead = current;      //If is the first node in the list
            if (lowerTail == null) lowerTail = current;      //set the head an tail to the same value
            else lowerTail = lowerTail.next = current;       //Otherwise, add the node and update the tail
        }
        else
        {
            if (greaterHead == null) greaterHead = current;  //If is the first node in the list
            if (greaterTail == null) greaterTail = current;  //set the head an tail to the same value
            else greaterTail = greaterTail.next = current;   //Otherwise, add the node and update the tail
        }

        current = current.next;
    }

    if (greaterHead != null)
        greaterTail.next = null;

    if (lowerHead == null) return greaterHead;
    else
    {
        lowerTail.next = greaterHead;
        return lowerHead;
    }
} 

由于节点是按照原始列表中的显示方式添加的,所以顺序得以保留

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对链表进行分区 的相关文章

  • 两个未排序小数组的交集算法

    我正在寻找一种在非常特定的条件下对两个小型未排序数组进行交集的算法 数组项的类型只是整数或类整数类型 在相当长的时间内 大约 30 40 一个或两个数组可能为空 数组通常非常小 通常为 1 3 个项目 我预计不会超过 10 个 交集函数会被
  • D3.js 对力导向图使用什么算法?

    我有兴趣确切地知道 D3 使用什么算法来实现库中的力导向图功能 读过科布罗夫的总结 http www cs brown edu rt gdhandbook chapters force directed pdf力导向图的历史让我有点困惑 不
  • 不同类型的二维数组

    我想创建一个二维数组 在其中存储数据库中的记录 所以我们可以说第一个是类型int和第二个类型String 这里我只描述一条记录 所以基本上是数据库列的类型 我该怎么做 数组是正确的数据结构吗 我不确定我是否关注 但您可能正在寻找Map
  • Python 中聚类相似字符串的算法?

    我正在编写一个脚本 该脚本当前包含多个 DNA 序列列表 每个列表都有不同数量的 DNA 序列 并且我需要根据汉明距离相似性对每个列表中的序列进行聚类 我当前的实现 目前非常粗糙 提取列表中的第一个序列并计算每个后续序列的汉明距离 如果它在
  • Lamport 的 Paxos 中的矛盾做了简单的论文

    阶段 2 a 如果提议者收到大多数接受者对其准备请求 编号为 n 的响应 则它向每个接受者发送一个接受请求 以获取编号为 n 且值为 v 的提案 其中 v 是响应中编号最高的提案的值 或者如果响应未报告任何提案 则为任意值 正如论文中提到的
  • 按顺时针顺序对四个点排序

    数组中的四个 2D 点 我需要按顺时针顺序对它们进行排序 我认为只需一次交换操作就可以完成 但我还没有能够正式放下这一点 编辑 在我的例子中 这四个点是凸多边形 编辑 这四个点是凸多边形的顶点 它们不必按顺序排列 如果你想从更数学的角度来看
  • 拓扑排序卡恩算法 BFS 或 DFS

    拓扑排序的方法是BFS还是DFS 哪个正确 我认为BFS是对的 但有些网站说DFS 有些网站说BFS 我很困惑 卡恩算法与 BFS 或 DFS 相同吗 或者BFS 或DFS 只是卡恩算法的工具 Kahn算法和DFS在实践中都用于拓扑排序 选
  • 将曲线图案与图像边缘匹配

    我有一个要搜索沿其边缘的曲线的目标图像和一个包含该曲线的模板图像 我需要实现的是在目标图像中找到模板图像中的曲线的最佳匹配 并根据分数来判断是否匹配 这还包括曲线的旋转和大小调整 目标图像可以是 Canny Edge 检测器的输出 如果这能
  • Deflate 压缩 - 数值示例

    我真的很想看看一个数字示例 手动压缩如何进行压缩 以下非常短的文本 abc 已使用 deflate 算法进行压缩 输出 eJxLTEoGAAJNASc 其二进制表示法为 01100101 01001010 01111000 01001100
  • 单链表的时间复杂度

    我正在研究数据结构 单链表 该网站称单链表的插入和删除时间复杂度为O 1 我错过了什么吗 网站链接 http bigocheatsheet com 我用 C 做这个 而且我只有一个root pointer 如果我想插入到最后 那么我必须一直
  • 快速计算幂(例如 2^11)[重复]

    这个问题在这里已经有答案了 可能的重复 实现基于整数的幂函数 pow int int 的最有效方法 https stackoverflow com questions 101439 the most efficient way to imp
  • Rust 中删除单链表中的节点

    我是 Rust 新手 想用 Rust 编写链表来获得乐趣 我对如何删除链表中的节点感到困惑 这是我的简单代码 derive Debug struct Node v usize next Option
  • 转置矩阵存储在一维数组中,无需使用额外的内存[重复]

    这个问题在这里已经有答案了 可能的重复 矩阵的就地转置 https stackoverflow com questions 9227747 in place transposition of a matrix 最近参加了技术笔试 通过以下问
  • n维匹配算法

    在这里寻求一些建议 有谁知道在 n 维空间中开始研究匹配算法的好地方 例如 任何约会网站都必须使用某种算法来匹配 2 个人 我读到的是 我们可以将一个人的特征映射到一个 n 维数组中 每个特征都有一个点系统 一旦我们拥有一个人的所有 可用
  • STL 哈希函数

    STL 是否有公开公开的可用哈希函数 我知道有一些使用哈希值的非标准实现 例如boost hash map 并且MSVC8实现了hash map hash set 等的版本 但有没有哈希函数C 98 STL 中定义的 如果不是 可靠哈希函数
  • 带提示的二分查找

    我有一个简单的std vector包含一些已排序的数字 按升序 我想查找一个元素 到目前为止我使用 return std lower bound vec begin vec end needle Where needle是我寻找的元素 然而
  • 如何决定权重?

    对于我的工作 我需要某种具有以下输入和输出的算法 输入 一组日期 过去的日期 输出 一组权重 每个给定日期一个权重 所有权重的总和 1 基本思想是 距离今天日期最近的日期应该获得最高的权重 第二个最接近的日期将获得第二高的权重 依此类推 有
  • 这些加密算法有什么区别?

    两者有什么区别MCRYPT RIJNDAEL 128 MCRYPT RIJNDAEL 256 MCRYPT BLOWFISH等等 哪一种最适合网络数据传输 Rijandel 是 AES 的另一个名称 AES 是当前的 一个好的标准 算法 数
  • 如何有效地从连续字符串中提取文字单词? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将没有空格的文本拆分为单词列表 https stackoverflow com questions 8870261 how to split text without spaces into li
  • 优化完美平方问题,类似于Python中的硬币找零

    我这里有一个硬币兑换的解决方案 python 中的 leetcode 硬币兑换 https stackoverflow com questions 69517078 coin change leetcode in python 因为完全平方

随机推荐

  • 在 Pandas DataFrame 中拆分列列表

    我正在寻找解决以下问题的好方法 我当前的修复不是特别干净 我希望从您的见解中学习 假设我有一个 Panda DataFrame 其条目如下所示 gt gt gt df pd DataFrame index 1 2 3 columns Col
  • 两个3D点云变换矩阵

    我试图猜测两个 3D 点云之间的刚性变换矩阵是哪个 这两个点云是 来自 kinect 的关键点 kinect keypoints 来自 3D 对象 盒子 的关键点 object keypoints 我尝试过两种选择 1 实现寻找刚性变换的算
  • 为什么 PyPy 翻译这么慢?

    将 pypy 实现转换为 c 文件并在具有 2G mem 和 Intel Core2 2GHz CPU 的现代笔记本电脑上构建 pypy c 需要几个小时 我知道这是一个 CPU 密集型任务 但是有必要这么慢吗 有没有机会或者空间来减少计算
  • Rails 3 时区错误

    我在 Rails 3 beta 中的时区支持方面遇到了困难 我想知道这是否是一个错误 或者我是否做错了什么 他就是问题所在 gt Time zone Madrid it is GMT 2 gt Madrid gt c Comment new
  • 如何测试一个对象是否是一个可以接受 jQuery 中的 .each() 的集合?

    如何测试一个对象是否是一个可以接受 jQuery 中的 each 的集合 提前致谢 试长度 if my class length gt 1 http jsfiddle net AlienWebguy QhFDN http jsfiddle
  • WOPI 主机未呼叫

    我想知道为什么我的 WOPI 主机没有被呼叫 我通过类似于以下内容的 HTML 页面启动我的主机 https github com Microsoft Office Online Test Tools and Documentation b
  • warpPerspective和perspectiveTransform有什么区别?

    我使用了四组点来获得透视变换矩阵 然后使用warpPerspective变换矩阵A到矩阵B Mat A 中的点 a 我想在 mat B 中获得新点的位置 但是warpPerspective不能那样做 同时perspectiveTransfo
  • 使用Maven安装Bower组件并全局安装Bower

    我使用 NPM 在全球范围内安装了 Bower 在我的 Maven 项目中 我有一个 Bower json 文件 我使用 exec maven plugin 在构建时安装 Bower 组件 但是它失败了 因为它 无法在目录中运行程序 bow
  • 如何在子类中键入注释重写的方法?

    假设我已经有一个带有类型注释的方法 class Shape def area self gt float raise NotImplementedError 然后我将对其进行多次子类化 class Circle def area self
  • Azure 服务总线主题订阅的锁定持续时间重要性

    我一直在研究服务总线队列和主题的锁定持续时间和更新锁定机制 然而 目前尚不清楚锁定持续时间对于主题订阅到底意味着什么 例如 如果我有一个主题 GameScoreUpdate 并且它有多个订阅者 因此 此主题的任何消息都将传递给所有订阅者 现
  • Redmine vs Chiliproject [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在从实验性安装切换Redmine http www redmine org以供公司广泛使用 我们确实使用了一些我们必须使用的插件 例如 re
  • 安装了邪恶的Emacs。我该如何开始呢?

    出于好奇 我想尝试一下 emacs evil 这是我到目前为止所做的 在 Windows 7 上安装 emacs 24 进展顺利 创建了一个 emacs 文件C Users name AppData Roaming emacs d 结束的地
  • 使用 CSP + localStorage 保护单页应用程序免受 CSRF 和 XSS 的影响

    我有一个单页应用程序 包含敏感内容 并且需要保护 这个问题专门针对 XSS 和 CSRF 攻击 解释 很多地方都提出了建议 例如here http michael coates blogspot ca 2010 07 html5 local
  • 如何在 setup.py 中将 whl 文件列为依赖项

    注意 我对 python 很陌生 我来自 gradle maven 世界 我读过这个博客 https underyx me 2015 11 23 adding an unreleased commit as a dependency htt
  • 使用 Spring 配置文件设置系统属性

    配置 Spring 2 5 Junit 4 Log4jlog4j 文件位置是从系统属性指定的 log location 在运行时 使用 D java 选项设置系统属性 一切都很好 问题 我需要什么 在单元测试时 未设置系统属性 且未解析文件
  • SwiftUI 中单击按钮时的 NavigationView 和 NavigationLink?

    我试图从登录视图推送到详细视图 但无法成功 甚至导航栏也没有显示在登录视图中 如何在 SwiftUI 中按下按钮单击 如何在按钮单击时使用 NavigationLink var body some View NavigationView V
  • 领域驱动设计和安全

    这与此相关question https stackoverflow com questions 3006808 security implementation in domain driven design这似乎是不久前问过的 项目中的安全
  • Swift - 防止 UIViewController 中的返回事件

    我有一个关于取消 UIViewController 中后退按钮触发的后退事件的问题 在 Objective C 中有以下内容扩大 https github com onegray UIViewController BackButtonHan
  • 获取当月的星期一到星期六

    在一个月内 我想知道当月的周一到周六 例如 2011 年 10 月有 3 oct 2011 to 8 oct 2011 10 OCt 11 to 15 Oct 11 17 Oct 11 to 22 oct 2011 24 Oct 2011
  • 对链表进行分区

    我正在尝试基于链表数据结构来解决这个算法问题 问题如下 给定一个链表和一个值 x 对其进行分区 使得所有小于 x 的节点都位于大于或等于 x 的节点之前 您应该保留两个分区中节点的原始相对顺序 例如 给定 1 gt 4 gt 3 gt 2