【问题标题】:Doubly-linked list insertion sort function: Why isn't my insertion sort function inserting the last two integer inputs into my linked list?双向链表插入排序函数:为什么我的插入排序函数没有将最后两个整数输入插入到我的链表中?
【发布时间】:2015-01-28 09:28:53
【问题描述】:

我的插入排序函数似乎没有将最后两个整数输入:15 ​​和 8 插入到我的双向链表中。我的输出遗漏了 15 和 8。我在插入排序功能中做错了什么?我已经提供了我的函数的代码、输入和输出。谢谢。

这是我的插入排序函数:

    public void insertionSort(int p)
   {
    Node n = new Node(p);
    Node curr = head;

    if(isEmpty())
    {
        head = n;
    }

    else
    {
        if(n.getProb() <= curr.getProb())
        {
            n.setNext(curr);
            curr.setPrev(n);
            head = n;
        }

        else if(n.getProb() > curr.getProb())
        {
            while(n.getProb() > curr.getProb() && curr.getNext() != null)
            {
                curr = curr.getNext();
            }

            if(n.getProb() < curr.getProb())
            {
                n.setNext(curr);
                n.setPrev(curr.getPrev());
                curr.setPrev(n);
            }

            else if(n.getProb() >= curr.getProb())
            {
                n.setNext(curr.getNext());
                n.setPrev(curr);
                curr.setNext(n);
            }
        }
    }
    size++;
  }

这是我的打印功能

    public void printSortedList()
{
    Node curr = head;

    while(curr != null)
    {
        System.out.println(curr.getProb());
        curr = curr.getNext();
    }
}

这是我在 main 函数中的输入方式:

public static void main(String [] args)
{
    List list = new List();

    list.insertionSort(10);
    list.insertionSort(5);
    list.insertionSort(5);
    list.insertionSort(60);
    list.insertionSort(5);
    list.insertionSort(10);
    list.insertionSort(15);
    list.insertionSort(8);

    list.printSortedList();
}

这是我的输出:

5
5
5
10
10
60

【问题讨论】:

  • 最简单的失败示例是什么?你可以添加一个单元测试来证明这一点吗?当您在调试器中单步执行代码时会看到什么?
  • @PeterLawrey 我将输入更改为仅 3 个整数 list.insertionSort(3); list.insertionSort(100); list.insertionSort(5); 我得到的输出是:3 100 所以我的函数似乎遗漏了 5 in这个案例。

标签: java doubly-linked-list insertion-sort


【解决方案1】:

您在插入n.getProb() &lt;= curr.getProb() 时遇到错误 在你的代码中

n.setNext(curr);
n.setPrev(curr.getPrev());
curr.setPrev(n);

  1. 将 n 的下一个设置为 curr -- ok
  2. 将 n 的 prev 设置为 currPrev -- ok
  3. 将 curr 的 prev 设置为 n -- 错误,您错过了指向 curr 的 prev 的链接,它仍然引用 curr

n.getProb() &gt; curr.getProb() 部分代码中存在同样的问题。

正确插入:

           if (n.getProb() <= curr.getProb()) {
                n.setNext(curr);
                n.setPrev(curr.getPrev());
                if (curr.getPrev() != null)
                     curr.getPrev().setNext(n);//set next to curr's prev
                curr.setPrev(n);
            } else if (n.getProb() > curr.getProb()) {
                n.setNext(curr.getNext());
                n.setPrev(curr);
                if (curr.getNext() != null)
                     curr.getNext().setPrev(n);//set prev to curr's next
                curr.setNext(n);
            }

【讨论】:

    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多