如何对 LinkedList 的字符串数据进行排序
Posted
技术标签:
【中文标题】如何对 LinkedList 的字符串数据进行排序【英文标题】:How to order string data of LinkedList 【发布时间】:2019-04-08 20:03:21 【问题描述】:如何订购包含字符串类型 a,c,d,b,b,d,c,a,c
的 LinkedList。订购后的输出应该是这样的c,c,c,a,a,d,d,b,b
。
复杂度也应该是 O(1*n)。
【问题讨论】:
以下是什么顺序? linledlist中有一个字符串数据,它们是a,c,d,b,b,d,c,a,c。头节点指向列表中的第一个“a”节点。我需要对它们进行分组,输出应该是具有 O(n) 复杂度的 c,c,c,a,a,d,d,b,b。 如果只需要分组,为什么不将List
转换为Map
的List
s 呢?
第三次问了,你能回答为什么要这样分组吗?为什么不 d,d,a,b,b,c,c,c 或 b,b,c,c,c,a,d,d, ...?为什么你是变种?因为你需要一个规则来排序
这个订单是从什么得到的?您需要能够定义一个函数,该函数接受任意两个项目并确定它们应该以哪种方式排序。我怀疑这是XY problem...
【参考方案1】:
我假设组/名称/项目总是四个并且总是c
、a
、d
和b
。在这种假设下很容易:创建四个列表,一个用于c
项目,一个用于a
项目,等等。遍历您的链表;对于每个项目,将其附加到相应的新列表中。您可以在字符串上使用switch
。最后以正确的顺序附加四个新列表。
这将花费 O(n) 时间和 O(n) 空间。
如果由于某种原因(我不知道它可能是什么)您不想创建四个列表,只需保留对排序列表中四个位置的四个引用,其中 c
、a
、应插入 d
和 b
项目。不过,这将需要决定指向何处,只要所有四个名字都未在列表中。
【讨论】:
谢谢!那么,如何在单个 LinkedList 上解决这个问题(不创建 4 个链表)?我可以使用哪种排序算法?【参考方案2】:这是用于库存管理系统。有 4 种类型的数据名 a,b,c 和 d
所以,你需要在你的帖子中添加它(如果可能的话,还要解释这个场景)。
算法
既然你说只有 4 种类型的数据,请维护 8 个变量 - 节点a
、b
、c
、d
的每种数据类型 2 个,如下所示。
现在,遍历链表,每当您收到Node head_c = null,tail_c = null; Node head_a = null,tail_a = null; Node head_d = null,tail_d = null; Node head_b = null,tail_b = null;
c
,请执行以下操作。
if(head_c == null) head_c = current_node; else tail_c.next = current_node; tail_c = current_node;
对其他节点 a
,d
,b
也执行上述操作。我们在这里尝试做的基本上是使用链表的 same(same hashCode) 节点分别创建 4 个单独的列表 c
,a
,d
,b
。
现在,正如您可能已经理解的那样,所要做的就是将每个列表的尾部分配给另一个列表的头部。见下文。
所以,你得到了main_head = head_c; tail_c.next = head_a; tail_a.next = head_d; tail_d.next = head_b; tail_b.next = null;
c
,a
,d
,b
的分组。
时间复杂度-O(n),空间复杂度为O(1)。
【讨论】:
谢谢!那么,如何在单个 LinkedList 上解决这个问题(不创建 4 个链表)?我可以使用哪种排序算法? @kaann45 这些是 4 个链表,但这些是来自您的单个 LinkedList 本身的节点。我没有使用new
关键字创建 4 个不同的新列表。
@kaann45 您可以将其视为一种bucket sort
,其中每个type
的数据代表一个bucket
。
我遇到了空指针异常错误。可能是什么原因?
问题是:如果在主循环中有3个不同的数据分配给链表并执行printScreen方法然后因为这个连接而弹出NullPointerException:main_head = head_c; tail_c.next = head_a; tail_a.next = head_d; tail_d.next = head_b; tail_b.next = null;。我如何避免这种情况,因为我想在少于 4 种数据类型时打印到屏幕上。【参考方案3】:
如果您使用的是 Java 8,则可以使用 stream()
。看下面的代码:
用这个对你的数据进行排序:
linkedList.stream().sorted().collect(Collectors.toList())
或者你可以用这个来反向排序集合:
linkedList.stream().sorted(Collections.reverseOrder()).collect(Collectors.toList())
【讨论】:
这不是 O(N),它会按自然顺序而不是问题中要求的特定顺序排序。以上是关于如何对 LinkedList 的字符串数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在熊猫数据框中对字符串进行排序或检查等效性而不考虑顺序?