【问题标题】:Sorting a Linked List of Strings对字符串的链接列表进行排序
【发布时间】:2018-03-23 11:01:23
【问题描述】:
public class LinkedList {
    private Node top;

    public LinkedList() {
        top = null;
    }

    public void add(String data) {
        Node temp = new Node(data, top);
        top = temp;
    }

    public void sort() {
        LinkedList sortedList = new LinkedList();
        Node i;
        Node j;
        String temp;
        String temp2;
        String temp3;
        for (i = top; i != null; i.getNext()) {
            for (j = i.getNext(); j != null; j.getNext()) {
                if (i.getData().compareTo(j.getData()) < 0) {
                    temp = i.getData();
                    i.setData(temp);
                    temp2 = j.getData();
                    j.setData(temp2);
                    temp3 = temp;
                    temp = temp2;
                    temp2 = temp3;
                    sortedList.add(temp3);
                } else if (i.getData().compareTo(j.getData()) > 0) {
                    temp3 = i.getData();
                    sortedList.add(temp3);
                }
            }
        }
    }
}

谁能检查我的代码并告诉我为什么我的temptemp2 从未被分配和使用?为什么这不起作用?

当我运行 main 时,我只得到原始链表而不是排序的链表。

我的逻辑是否正确?我正在尝试按升序对字符串进行排序。

【问题讨论】:

  • 你能说说top是什么吗?它是第一个节点还是最后一个节点?你能验证输入列表是否有正确的数据。
  • 在逐行调试代码的时候发现了什么?
  • Top 是我的第一个节点,它为 null 或为空。
  • 你应该使用 Collections.sort() 方法。另请访问此网址以获得更好的理解。 stackoverflow.com/questions/10042/…
  • 调试时我发现它一遍又一遍地重复相同的数据值..?

标签: java sorting linked-list bubble-sort


【解决方案1】:

自从 OP 更新了他的代码 sn-p 后,下面的代码就不能工作了,因为提到的 LinkedList 是自定义 List 而不是 java.util.LinkedList。

由于缺少“top”变量,无法运行您的代码。 顺便说一句,如果您需要将 i 和 j 的所有值都保存到单个排序的 LinkedList 中,请尝试以下操作:

    LinkedList sortedList = new LinkedList();

    sortedList.addAll( ALL_YOUR_VALUES FROM i )
    sortedList.addAll( ALL_YOUR_VALUES FROM j )

    Collections.sort(sortedList);
    // now your LinkedList should be sorted

【讨论】:

  • 这不起作用,因为 OP LinkedList自定义实现,而不是 java.util.LinkedList。它没有实现Collection,因此无法使用这些方法。
【解决方案2】:

说明

您正在将(可能)排序的值分配给新列表sortedList。此列表与您的原始列表 (this)无关。因此您的原始列表不会改变。

最后你需要将sortedList的结构复制到你当前的实例中,或者直接就地排序。


解决方案

因此,假设您的排序确实有效,请将类似这样的内容附加到 sort() 的末尾:

// Copy data of sorted list over to own instance
Node currentSortedElement = sortedList.top;
Node currentNonSortedElement = top;

while (currentSortedElement != null) {
    // Extract data and copy over
    currentNonSortedElement.setData(currentSortedElement.getData());

    // Prepare next iteration
    currentSortedElement = currentSortedElement.next;
    currentNonSortedElement = currentNonSortedElement.next;
}

因此请查看以下列表

index      | 0  1  2  3  4  5
-----------|-----------------
sorted     | 1  4  4  6  8  9
non-sorted | 4  1  6  9  8  4

算法只会将排序列表中的每一项的数据复制到非排序列表中相同索引的项目中,所以

index      | 0  1  2  3  4  5
-----------|-----------------
sorted     | 1  4  4  6  8  9
           | |  |  |  |  |  |
           | v  v  v  v  v  v
non-sorted | 1  4  4  6  8  9

注意事项

根据您的评论,您尝试实现Bubblesort。考虑查看相关问题Bubble Sort Manually a Linked List in Java,它显示了一个工作代码示例,并附有解释。

【讨论】:

  • 嘿,感谢您的解释,现在我在 currentNonSortedElement.setData(currentSortedElement.getData());
  • @AliKhan 听起来你的currentNonSortedElement 对象是null。这通常意味着您的代码中有逻辑错误。提出新问题的好机会 :) 但首先请务必阅读 What is a NullPointerException, and how do I fix it?。如果答案有帮助,请考虑投票和/或接受它。
猜你喜欢
  • 2016-12-24
  • 2015-03-26
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多