我花了3个小时搜索并尝试自己制作算法。我无法弄清楚,有人能给我一个按字母顺序对链接列表进行排序的算法吗?
这是我在放弃搜索之前尝试的最后一件事,并决定在这里问一下
class link
{
public void insertNewFirstNode(String value)
{
StringNode newNode = new StringNode(value, head);
head = newNode;
if(tail==null)
{
tail=head;
}
}
public link sort(link L)
{
link sorted = new link();
StringNode currentNode = head;
while (currentNode != null)
{
int data=0;
if((currentNode.getLink() != null))
{
data=currentNode.getData().compareTo(currentNode.getLink().getData());
if(data==1)
{
sorted.insertNewFirstNode(currentNode.getData());
}
currentNode = currentNode.getLink();
}
else if((currentNode != null))
{
currentNode = currentNode.getLink();
}
}
sorted.reverse();
return sorted;
}
//Other functions
}
答案 0 :(得分:1)
对LinkedList
进行排序是O(n 2 * log(n)),因为迭代列表找到一个位置需要O(n)时间并且O(n * log(n))对它进行排序。因此,最好的做法是将列表转换为数组,对数组进行排序,然后遍历数组并将列表中的节点设置为正确的顺序,即O(n + n * log(n) ))。
这正是Collections.sort()
所做的(使用合并排序)。您需要做的只是覆盖.compareTo()
,以便根据字母顺序排序并StringNode
实施Comparable<StringNode>
。
或者,您可以执行以下操作:
Collections.sort(myList, new Comparator<StringNode>() {
public int compare(StringNode node1, StringNode node2) {
return node1.getData().compareTo(node2.getData());
}
});
NB:
您的myList
课程必须实施List
,或者扩展一些内容。