对链表进行分区

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(使用前将#替换为@)

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

  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • Java 2d 游戏中的路径查找?

    本质上它是我正在开发的一款吃豆人克隆游戏 我有一个 Enemy 类 并创建了该类的 4 个实例 它们都代表游戏的 4 个幽灵 所有幽灵都会在屏幕的随机区域启动 然后它们必须朝着吃豆人角色前进 当玩家控制吃豆人并移动它时 他们应该跟随它并尽可
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 如何计算 3D Morton 数(交织 3 个整数的位)

    我正在寻找一种快速计算 3D Morton 数的方法 这个网站 http www graphics stanford edu seander bithacks html InterleaveBMN有一个基于幻数的技巧来处理 2D Morto
  • 贝尔曼福特算法可以有任意的边顺序吗?

    我刚刚开始学习新算法 但当我阅读 极客为极客而写的贝尔曼福特算法 时 我陷入了困境 http www geeksforgeeks org dynamic programming set 23 bellman ford algorithm h
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 连接红黑树

    OCaml 标准库有一个很棒的Set使用非常有效的分而治之算法来计算的实现union两套 我相信它会从一组中获取整个子树 而不仅仅是单个元素 并将它们插入到另一组中 并在必要时重新平衡 我想知道这是否需要 OCaml 使用的 AVL 树中保
  • 面试题:三个数组,O(N*N)

    假设我们有three长度数组N其中包含任意数量的类型long 然后我们得到一个数字M 相同类型 我们的任务是选择三个数字A B and C每个数组中的一个 换句话说A should从第一个数组中选取 B从第二个开始和C从第三个 所以总和A
  • 用于查找最近邻居的空间划分算法如何工作?

    为了找到最近的邻居 空间分区 http en wikipedia org wiki Nearest neighbor search Space partitioning是算法之一 它是如何工作的 假设我有一组 2D 点 x 和 y 坐标 并
  • 当满足动态条件时退出递归函数

    使用来自的函数生成汉明距离 t 内的所有比特序列 https stackoverflow com questions 40813022 generate all sequences of bits within hamming distan
  • 计算序列而无法存储值?

    问题陈述 here http www spoj com problems EC SER 令 S 为无限整数序列 S0 a S1 b Si Si 2 Si 1 对于所有 i gt 2 你有两个整数 a 和 b 您必须回答有关序列中第 n 个元
  • 调度算法,找到设定长度的所有非重叠区间

    我需要为我的管理应用程序实现一种算法 该算法将告诉我何时可以将任务分配给哪个用户 我实现了一个蛮力解决方案 它似乎有效 但我想知道是否有更有效的方法来做到这一点 为了简单起见 我重写了算法以对数字列表进行操作 而不是数据库查询等 下面我将尝
  • 密文窃取算法 - 哪一种是正确的?

    网络上提出了两种算法 在这两种算法中 第一部分是相同的 1 Pad the last partial plaintext block with 0 2 Encrypt the whole padded plaintext using the
  • while循环的时间复杂度是多少?

    我正在尝试找出 while 循环的时间复杂度 但我不知道从哪里开始 我了解如何找到 for 循环的复杂性类别 但是当涉及到 while 循环时 我完全迷失了 关于从哪里开始有什么建议 提示吗 这是一个问题的示例 x 0 A n some a
  • 相当于字典的数据结构?

    我正在使用 JavaScript 工作 希望保留一份设置的公里 英里 小时近似值列表 我无法以编程方式进行转换 我正在使用需要某些值的外部 API 因此它确实必须是等效的字典 目前我正在使用一个对象 var KM MPH 10 16 12
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 检查二维数组中是否存在任何数字的程序

    我知道如何检查数组中是否存在数字 但不知道如何检查数字是否存在于数组中2D array 请帮我2D include
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该

随机推荐

  • 在 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