如何对 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 转换为MapLists 呢? 第三次问了,你能回答为什么要这样分组吗?为什么不 d,d,a,b,b,c,c,c 或 b,b,c,c,c,a,d,d, ...?为什么你是变种?因为你需要一个规则来排序 这个订单是从什么得到的?您需要能够定义一个函数,该函数接受任意两个项目并确定它们应该以哪种方式排序。我怀疑这是XY problem... 【参考方案1】:

我假设组/名称/项目总是四个并且总是cadb。在这种假设下很容易:创建四个列表,一个用于c 项目,一个用于a 项目,等等。遍历您的链表;对于每个项目,将其附加到相应的新列表中。您可以在字符串上使用switch。最后以正确的顺序附加四个新列表。

这将花费 O(n) 时间和 O(n) 空间。

如果由于某种原因(我不知道它可能是什么)您不想创建四个列表,只需保留对排序列表中四个位置的四个引用,其中 ca、应插入 db 项目。不过,这将需要决定指向何处,只要所有四个名字都未在列表中。

【讨论】:

谢谢!那么,如何在单个 LinkedList 上解决这个问题(不创建 4 个链表)?我可以使用哪种排序算法?【参考方案2】:

这是用于库存管理系统。有 4 种类型的数据名 a,b,c 和 d

所以,你需要在你的帖子中添加它(如果可能的话,还要解释这个场景)。

算法

既然你说只有 4 种类型的数据,请维护 8 个变量 - 节点 abcd 的每种数据类型 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 的字符串数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

arrayList和linkedList在排序上的区别

如何在Mysql查询中通过PHP对加密数据进行排序

如何按字符串索引上的自定义顺序对熊猫数据框进行排序

如何在熊猫数据框中对字符串进行排序或检查等效性而不考虑顺序?

Excel:如何像数据透视表一样对一系列带有前导零的数字进行排序?

如何在 swift 中按字母顺序对 JSON 字符串进行排序?