对LinkedList排序会导致失去LinkedList中间值,并且在java中只返回第一个和最后一个作为排序值

对LinkedList排序会导致失去LinkedList中间值,并且在java中只返回第一个和最后一个作为排序值,java,data-structures,linked-list,Java,Data Structures,Linked List,我的链接列表- class MyList{ int N; MyList next = null; MyList(int N){ this.N = N; } @Override public String toString() { MyList curr = this; String output = "";

我的链接列表-

class MyList{
        int N;
        MyList next = null;
        MyList(int N){
            this.N = N;
        }

        @Override
        public String toString() {
            MyList curr = this;
            String output = "";
            while(curr != null){
                output = output+curr.N+"-->";
                curr = curr.next;
            }
            return output+"TAIL";
        }
    }
排序方法算法-

private static MyList sortLL(MyList L){
        int temp;
        if(L == null || L.next == null)
            return L;

        MyList current = L;
        MyList previous = null;

        while(current.next != null){
            if(current.N > current.next.N){
                temp = current.N;
                current.N = current.next.N;
                current.next.N = temp;
            }
            previous = current;
            current = current.next;
        }


        return previous;
    }
输入-

MyList list_Sort = new MyList(9);
        list_Sort.next = new MyList(8);
        list_Sort.next.next = new MyList(8);
        list_Sort.next.next.next = new MyList(7);
        list_Sort.next.next.next.next = new MyList(5);
        list_Sort.next.next.next.next.next = new MyList(4);
        list_Sort.next.next.next.next.next.next = new MyList(6);
        list_Sort.next.next.next.next.next.next.next = new MyList(3);
        list_Sort.next.next.next.next.next.next.next.next = new MyList(1);
        list_Sort.next.next.next.next.next.next.next.next.next = new MyList(2);
输入-9-->8-->8-->7-->5-->4-->6-->3-->1-->2-->尾部

输出-2-->9-->尾部

预期输出-输入应按顺序排序


首先,您不能使用所示的算法对其进行排序。排序是一个O(n^2)操作,假设您使用的是bubblesort。下一个问题是您的“上一个”被覆盖

实际上,您不需要在逻辑中使用前一个。您不是交换列表的节点,而是交换列表的值。不必返回previous(将其全部删除),只需使用L导航列表即可


另一方面,假设你正在尝试学习新事物;我建议您学习如何使用调试器

通过在Eclipse中浏览代码,您将学到比这里任何答案都要多的东西。让陌生人通过检查发现代码中的错误是没有效率的。您应该使用调试器或打印语句来识别(或至少隔离)问题,然后返回一个更具体的问题(一旦您将问题缩小到10行)。问题是先前的,因为它也因为引用current而减少,我期待着一个线索来分类,只有当我同意你们的观点时,我才会感谢你们给出一些可靠的答案。你会惊讶地发现,有多少人连一两堂课都不学就开始编程了。他很好奇,到处打听,请不要让他气馁。我不清楚你为什么要在这里归还任何东西。这里的逻辑是将列表元素中的值(而不是元素本身)进行混洗,以便最终给出的列表头将包含正确的值。您可能基于一个C实现,其中使用了指针,并且实际的列表头元素(而不是其内容)发生了更改。我相信你的努力,但我仍然认为,在调试器中运行此代码并在列表发生变化时查看列表是你下一步的最佳选择。这是我面临的主要问题,导航意味着L->L。下一步,然后我将失去当前的L值,所以最后我只剩下最后的L值,我只是想知道如何设置它,你必须保持第一个节点引用。创建一个变量来保存第一个变量。但是它的引用,所以如果我保存相同的变量,那么如果分配的引用移动到下一个,那么我的新声明值将再次增长到下一个!或者你试图解释其他的东西,你必须理解按引用传递和按值传递之间的区别。这是一个基本概念,你可以四处搜索。这是面试中经常使用的问题之一。所以一定要仔细阅读。我不会回答你的问题,我想让你试着用调试器解决它