【问题标题】:Homework - Java - Selection Sort on my created double-linked list作业 - Java - 我创建的双链表上的选择排序
【发布时间】:2012-03-07 04:06:44
【问题描述】:

我的任务是创建自己的链表类(我不能使用 Java 的 LinkedList 类)并通过交换指针而不是数据来实现选择排序。

我创建了一个双向链接的 MyLinkedList 类,但我在使用排序方法时遇到了问题。我尝试了很多东西,但没有任何效果 - 甚至没有任何有意义的东西可以在这里发布以进行更正。 (我知道我至少需要使用一个临时节点。)它必须是选择排序

我不是一定要找人为我编写代码;我希望有人可以帮助我使用一种算法,然后我可以自己将其转化为代码。非常感谢任何帮助。

以下是我如何实现 MyLinkedList 类和关联的 Node 类:

public class MyLinkedList
{
    private Node head;
    private int count;

    public MyLinkedList()
    {
        head = new Node(null);
        count = 0;
    }

    public void add(String line)
    {
        Node temp = new Node(line);
        Node current = head;

        while (current.getNext() != null)
        {
            current = current.getNext();
        }

        temp.setLine (line);  // not sure this is how to do it
        current.setNext(temp);
        temp.setPrev(current);
        count++;
    }

    public void displayList()
    {
        Node current = head;

        for (int i = 0; i < count; i++)
        {
            current = current.getNext();
            System.out.println(current.getLine());
        }
    }

    public void sortList()
    {       
        Node start = head;
        Node index = start;
        Node min = start;

        Node temp1, temp2;

        while (start.getNext() != null)
        {
            index = index.getNext();

            if (index.getLine().compareTo(min.getLine()) < 0)
            {
                min = index;
            }

            //swap - HELP, PLEASE :-)
            {
                // Algorithm???
            }
        }
    }

    public int size()
    {
        return count;
    }


    private class Node
    {
        String textLine;
        Node next;
        Node prev;

        public Node()
        {
            textLine = null;
            next = null;
            prev = null;
        }

        public Node (String line)
        {
            textLine = (line);
            next = null;
            prev = null;
        }

        public Node (String line, Node node1, Node node2)
        {
            textLine = line;
            prev = node1;
            next = node2;
        }

        public String getLine()
        {
            return textLine;
        }

        public Node getNext()
        {
            return next;
        }

        public Node getPrev()
        {
            return prev;
        }

        public void setLine(String line)
        {
            textLine = line;
        }

        public void setNext(Node nextNode)
        {
            next = nextNode;
        }

        public void setPrev(Node prevNode)
        {
            prev = prevNode;
        }
    }
}

【问题讨论】:

  • 您的添加和删除方法在列表中是否正常工作?您是否尝试过先做一个愚蠢的排序方法并从那里开始工作?类似于制作一个新列表,然后每次只获取最小的条目?
  • 还尝试制作可以完成选择排序所需的一切的方法,基本上将其分解为更小的问题。先做一个交换2个节点的方法,然后做一个找到某个节点的方法,再做一个找到最小节点的方法,再做一个找到给定节点之后的最小节点的方法。
  • 首先,您的代码是否正确构建了列表?我的意思是您是否尝试在添加一些临时值后显示列表?
  • 是的,我的代码可以正确构建和显示列表。 main 方法向用户询问文件名,然后读取文件并调用 add 方法将每一行存储在其自己的单独节点中。 displayList 函数将每个节点依次输出到屏幕上。
  • 我建议你也保留对尾部(最后一个节点)的引用,它会优化你的添加方法

标签: java algorithm list sorting


【解决方案1】:

如果一个空的MyLinked List 有一个节点,即使它只是一个有null prevnext 和数据的节点,它可能会让人感到困惑,所以你需要小心那个MyLinkedList 构造函数 -如果只是简单地阅读head = null; 可能会容易得多。

如果MyLinked List 也有一个tail 节点,这将很有用,可以让你沿着链走到最后,找到add 应该在哪里放置一个新的Node

在那之后,我认为问题在于您没有注意到您需要两个循环:一个是遍历列表以跟踪未排序节点的开始位置,另一个是从中找到最小的节点。您还需要为Node 编写一个swap 方法,这样您就可以编写类似这样的未经测试的伪代码,它恰好看起来很像Java

for (index = head; index != null; index = index.getNext()) {
  min = index;
  for (test = min.getNext(); test != null; test = test.getNext) {
    if (test.getLine().compareTo(min.getLine()) < 0)
        min = test;
  }
  if (min != index) {
    swap(index, min);
    index = min;
  }
}

swap 大概是这样的

public void swap(Node other)
{
  Node temp;

  temp = next;
  next = other.getNext();
  other.setNext(temp);

  temp = prev;
  prev = other.getPrev();
  other.setPrev(temp);

  other.getNext().setPrev(this);
  other.getPrev().setNext(this);

  this.getNext().setPrev(other);
  this.getPrev().setNext(other);
}

再次注意这是完全未经测试的,甚至没有见过编译器。

请务必考虑特殊情况,例如列表为空或其中只有一个元素,以及列表中只有一个未排序的节点。


我不能不指出swap 实际上比这要复杂得多。我添加了几行来更正要交换的节点之前和之后的节点中的指针。您还需要考虑:

  • 被交换的节点是否在列表的末尾,在这种情况下,列表的head(和tail,如果你有的话)将需要更新,而不是相邻节点的指针。这很明显。

  • 要交换的节点是否在列表中彼此相邻,当您应用正常算法时,您会得到指向自身的节点。这不太明显。

【讨论】:

  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多