如何订购LinkedList

时间:2018-11-05 12:48:44

标签: java algorithm sorting linked-list

如何订购包含字符串类型{a,c,d,b,b,d,c,a,c}的LinkedList。订购后,输出应类似于{c,c,c,a,a,d,d,b,b}。 复杂度也应为O(1 * n)。

3 个答案:

答案 0 :(得分:1)

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

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

如果由于某种原因(我不知道它可能是什么)您不想创建四个列表,只需在已排序列表中的四个地方保留四个引用,其中c,{{ 1}},ad项目应插入。不过,只要还不是所有四个名称都在列表中,就需要决定要指向何处。

快乐的编码。

答案 1 :(得分:1)

  

这是用于库存管理系统的。有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;
  • 对其他节点adb也执行与上述相同的操作。我们在这里要做的基本上是使用相同(相同hashCode)分别创建4个单独的列表cadb )链表中的节点。

  • 现在,您可能已经知道,所有要做的就是将每个列表的尾巴分配给另一个列表的头部。见下文。

main_head = head_c;
tail_c.next = head_a;
tail_a.next = head_d;
tail_d.next = head_b;
tail_b.next = null;
  • 因此,您得到了所需的cadb分组。
  • 时间复杂度- O(n),空间复杂度为 O(1)

答案 2 :(得分:0)

如果您使用的是Java 8,则可以使用stream()。看下面的代码:

使用以下方法对数据进行排序:

linkedList.stream().sorted().collect(Collectors.toList())

或者您可以使用以下方法反向排序集合:

linkedList.stream().sorted(Collections.reverseOrder()).collect(Collectors.toList())