Java 双链表上的BubbleSort

Java 双链表上的BubbleSort,java,data-structures,Java,Data Structures,请参阅以下代码:交换函数。因为这似乎是一个家庭作业问题,所以我不会给出完整答案。我相当肯定,问题在于您的交换功能。考虑在纸上绘制节点并通过交换函数,看看节点指向何处。考虑你正在交换的节点的上一个节点和下一个节点,并且你也必须更新它们的前/下一个!当然,除非setNext和setPrev函数已经这样做了 如果您需要其他帮助,请随时发表评论 编辑1: 此外,作为一个旁注,不要使用索引(I和J)来跟踪使用哪个节点,只考虑使用节点本身。然后当调用i++或j++时,改为调用node=node.getNex

请参阅以下代码:交换函数。

因为这似乎是一个家庭作业问题,所以我不会给出完整答案。我相当肯定,问题在于您的交换功能。考虑在纸上绘制节点并通过交换函数,看看节点指向何处。考虑你正在交换的节点的上一个节点和下一个节点,并且你也必须更新它们的前/下一个!当然,除非setNext和setPrev函数已经这样做了

如果您需要其他帮助,请随时发表评论

编辑1:

此外,作为一个旁注,不要使用索引(I和J)来跟踪使用哪个节点,只考虑使用节点本身。然后当调用i++或j++时,改为调用node=node.getNext()。这样,您就不会向运行时添加额外的因子n,并且可以完全消除交换函数

编辑2:

我在纸上画出来的意思是,在纸上按顺序水平写出每个值。然后在每个圆圈周围画一个圆圈,并在每种情况下画一个指向下一个圆圈和上一个圆圈的箭头。用铅笔画箭头!然后在逐步完成交换功能时相应地更新箭头。您甚至不必移动/擦除圆,只需擦除箭头并查看它们下一步指向何处

编辑3:

好的,你有两个圆圈,你想交换。这些圆圈都有向外的箭头,它们的邻居都有向内的箭头。这是每圈4个箭头(2英寸,2英寸,除非你处理的是头部/尾部)。由于您要移动2个圆,这意味着您必须总共更改8个箭头(除非处理头部/尾部)-每个圆4个。每个setPrev/setNext可能只更改一个箭头。这意味着在swap函数中通常应该调用8次。你只给他们打了4次电话

编辑4:

您正在更新上一个/下一个交换的节点,但不更新其邻居的节点。您需要执行类似first.getNext().setPrev(second)等操作来更新邻居的引用/prev/next/箭头

编辑5:

但是请记住空检查(不能在空值上调用setPrev或setNext,因此在设置邻居的prev/next时,请确保邻居实际存在(因为prev对于head不存在,而next对于tail不存在))

编辑6:

我猜如果你说你没有做作业…;)


这是一个家庭作业问题吗?如果是的话,请按照顺序标记。对于初学者,您可能需要i*n。到底为什么有人(a)使用冒泡排序和(b)排序链表?我正在分析,但我看不出问题,这不是家庭作业。。这是因为我正在研究数据结构,但我找不到示例。。请更具体地回答这个问题。。谢谢。请看我的编辑。setPrev/setNext函数的作用是什么?只是为了确定。哦,好吧,我会按照你的例子,看看发生了什么,如果我发现了错误,我就到这里来。。。谢谢..public Node getNext(){return next;}public void setNext(Node next){this.next=next;}public Node getPrev(){return prev;}public void setPrev(Node prev){this.prev=prev;}我在setNext/setPrev中做这个验证吗?(进入方法)
public Node get(int i) {  
    if (!isEmpty()) {  
        int j = 0;  
        Node element = head;  
        while (j++ < i) {  
            element = element.getNext();  
            if (element == null)  
                return null;  
        }  
        return element;  
    }  
    return null;  
}  



private void bubbleSort() {  
    for (int i = 0; i < size - 1; i++) {  
        boolean changed = false;  
        for (int j = 0; j < size - i - 1; j++) {  
            if (get(j + 1) != null) {  
                if (get(j).getValue() > get(j + 1).getValue()) {  
                    //System.out.println("Swapping: " + get(j).getValue() + " : " + get(j + 1).getValue());  
                    swap(get(j), get(j + 1));  
                    changed = true;  
                }  
            }  
        }  
        if (!changed)  
            return;  
    }  
}  

public void swap(Node first, Node mid) {  
    if (first == head)  
        head = mid;  
    if (mid == tail) {  
        tail = first;  
    }  
    first.setNext(mid.getNext());  
    mid.setPrev(first.getPrev());  
    first.setPrev(mid);  
    mid.setNext(first);  
}
public void swap(Node first, Node mid) {  
    if (first == head)  
        head = mid;  
    if (mid == tail) {  
        tail = first;  
    }  
    first.setNext(mid.getNext());  
    mid.setPrev(first.getPrev());  
    first.setPrev(mid);  
    mid.setNext(first);  
}
void swap(Node first, Node second) {
    Node firstPrev = first.getPrev();
    Node firstNext = first.getNext();
    Node secondPrev = second.getPrev();
    Node secondNext = second.getNext();

    if (firstPrev) {
        firstPrev.setNext(second);
    }
    if (firstNext) {
        firstNext.setPrev(second);
    }
    if (secondPrev) {
        secondPrev.setNext(first);
    }
    if (secondNext) {
        secondNext.setPrev(first);
    }

    second.setPrev(firstPrev);
    second.setNext(firstNext);
    first.setPrev(secondPrev);
    first.setNext(secondNext);
}