如何在两个节点之间交换数据? (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
。希望这有帮助。
我一直在做一个使用节点的项目,对于这个项目,我们必须根据节点中的项目的优先级(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
。希望这有帮助。