java - 在原位链表上实现自然归并排序,并且只交换来自节点的项目
问题描述
我必须在链表上实现自然合并排序(这很容易),但我不能更改节点的“下一个”属性,只需交换它们的值。我也不能倒退,因为节点没有“prev”属性。(链接列表没有随机访问)而且我无法创建新节点。
我只需要一些关于合并功能应该如何的提示。
我知道在合并之前保持两个子列表的顺序是关键,但我找不到解决方法。
这是节点类。他们保存了一个通用项目和下一个节点的地址
private class Node {
Item item;
Node next;
public String toString() {
if (next == null) return "[" + item + "]" + "->" + "null";
return "[" + item + "]" + "->" + next.item + ", ";
}
}
解决方案
如需灵感,请查看 STL 的inplace_sort
实现。该算法的核心部分是巧妙的旋转。当然,它需要向后遍历,您可以通过递归来实现。
简而言之,合并部分是沿着
merge (begin, mid, end)
left_mid = middle(begin, mid)
right_mid = lower_bound(left_mid.value, mid, end)
pivot = rotate(left_mid, mid, right_mid)
merge(left, left_mid, pivot)
merge(pivot, right_mid, end)
pivot
上面是初始begin
登陆的节点。为简洁起见,省略了退出递归。
推荐阅读
- python - 如何检查字典中的所有值是否存在于列表中?
- manpage - man: MANPATH 环境变量列表太长(manpath 列表太长)
- node.js - NodeJS:错误:在 TCP.onStreamRead (internal/stream_base_commons.js:111:27) 读取 ECONNRESET
- .net-core - 卸载旧版本的 Win10 和 .NetCore SDK 可以吗?
- ios - 如何以编程方式折叠 UIView?
- angular - 为输入字段设置默认前缀值
- c# - 在 Xamarin.Forms 中显示包含许多其他视图的视图的最佳方式
- antlr3 - ANTLR3 使用 java.lang.NullPointerException 引发内部错误
- eclipse - Git如何在更改分支时删除一些被忽略的文件
- git - 如何从 github 上的拉取请求中获取代码?