如何在两个节点之间交换数据? (Java)

How do you swap data between two nodes? (Java)

我一直在做一个使用节点的项目,对于这个项目,我们必须根据节点中的项目的优先级(0 - 2,其中 0 最高,2 最低)对节点进行排序持有(降序)。现在我已经部分工作了,因为当它实际进行交换时,它会将两个项目变成相同的(我只是想交换项目)。例如:我会输入 Node_1 其优先级为 0,然后 Node_2 其优先级为 1,然后应将其排序为:

Node_2(holds prio 1) --> Node_1(holds prio 0)

那么它应该 运行 将它们排序的方法(按优先级递减):

Node_1(holds prio 0) --> Node_2(holds prio 1)

但它只是将两个节点变为相同(相同优先级):

Node_1(holds prio 0) --> Node_1(holds prio 0)

无论我添加多少节点,它都保持不变。他们都转向具有最高优先级的同一个节点。任何帮助都会很棒。

代码:

private void sortJobs() {
    Node p, q, r;

    p = jobs;
    q = null;
    r = null;
    //only runs if there is more than 1 job
    while (p != null && p.next != null) {
        q = p;
        p = p.next;

        if (q.item.getPriority() > p.item.getPriority()) {
            r = q;
            q.item = p.item;
            p.item = r.item;


        }

    }

}

如果有更好的方法,请告诉我,因为我还在学习。

是否可以使用 PriorityQueue 而不是实现排序功能?

PriorityQueue<Node> pq = new PriorityQueue(new Comparator<Node>(){
    public int compare(Node a, Node b){
        return a.item.getPriority()-b.item.getPriority();
    }
});
p=jobs;
if(p==null) return p;
//add all jobs in PriorityQueue
while (p != null) {
    pq.add(p);
    p=p.next;
}
//Change next pointer
Node head=pq.poll();
Node prev=head;
while(pq.size()>0){
    Node n = pq.poll;
    prev.next=n;
    prev=n;
}
return head;

可能更像这样:

private void sortJobs(Node p) {

    if (p != null && p.next != null) {

        Node q = p.next;

        Item pItem = p.getItem();
        Item qItem = q.getItem();

        // check for nulls???  Safety???
        if (qItem.getPriority() < pItem.getPriority()) {

            p.setItem(qItem);
            q.setItem(pItem);

         }

         // almost forgot the recursion
         sortJobs(q);

    }

}

您保持节点的顺序相同,但交换其中的项目。我们在这里不需要复制到第三个虚拟值技巧,因为我们已经有对这两个项目的引用(无论如何我们都需要引用来获取优先级)。

这在安德烈亚斯的回答中已经说过,但我会进一步阐述。由于这是 Java,您的临时文件(在本例中为 r)仅引用了 q。这就是为什么当您更改 write q = p; 时,r 也会完全改变。因为它们引用了同一个对象实例。您需要创建一个临时项目才能正确交换。正确的解决方法是让 r 成为一个项目对象,然后设置 p.item = r。希望这有帮助。