使用链接列表插入优先级队列的方法

时间:2016-11-16 15:10:37

标签: java

首先,我觉得我应该提到这是一项任务。我没有找到直接的代码答案,只是为了指出我正确的方向。我们被要求在链表中实现优先级队列。

我正在努力编写insert()函数的第一部分。在代码中,我尝试检查head是否包含任何内容,如果没有,则将head设置为pqItem。它会这样做,但是当第二次插入再次调用insert时,它不会识别出head中已有PQueueItem并且只覆盖head而不是忽略{{ 1}}。我没有正确设置if (this.head == null)吗?

PQueue Class

head

PQueueItem类

package ci284.ass1.pqueue;

public class PQueue<T> {

private PQueueItem<T> head;
public static enum ORDER {
    ASC, DESC;
}
public static ORDER DEFAULT_ORDER;
private ORDER order;

public PQueue() {
    this.order = DEFAULT_ORDER;
    head = null;
}

...

public void insert(T data, int priority) {
    PQueueItem<T> pqItem = new PQueueItem<T>(data, priority);
    PQueueItem<T> temp;
    PQueueItem<T> prev;
    System.out.println("This is pqItem   " + pqItem);

    if (this.order == ORDER.DESC || this.order == DEFAULT_ORDER){
        if (this.head != null){
            System.out.println("Not null   " + head);
            if (priority <= head.getPriority()){

            }
            else if (priority > head.getPriority()){
                prev = head;
                System.out.println(prev);
                head.setNext(head);
                prev = pqItem;
                System.out.println(prev);
            }
        }
        if (this.head == null){
            System.out.println("Null    " + head);
            this.head = pqItem;
            System.out.println("Null    " + head);
        }
    }
}

插入的JUnit测试

package ci284.ass1.pqueue;

public class PQueueItem<T> {

private int priority;
private T data;
private PQueueItem<T> next;

public PQueueItem(T data, int priority) {
    this.data = data;
    this.priority = priority;
}
public int getPriority() {
    return priority;
}
public void setPriority(int priority) {
    this.priority = priority;
}
public T getData() {
    return data;
}
public void setData(T data) {
    this.data = data;
}
public PQueueItem<T> getNext() {
    return next;
}
public void setNext(PQueueItem<T> next) {
    this.next = next;
}

public String toString() {
    return String.format("[%s,%d]", data.toString(), priority);
}

}

测试返回:

@Test
public void testInsertStart(){
    PQueue<String> pq = new PQueue<String>();
    pq.insert("1",2);
    String head = pq.pop();
    assertEquals(head, "1");
    System.out.println("Worked");
    pq.insert("Hiya",3);
    assertEquals(head, "Hiya");
}

,控制台显示:

org.junit.ComparisonFailure: expected:<1> but was:<Hiya>

1 个答案:

答案 0 :(得分:0)

这是一些伪代码代码。 (我已经通过创建队列测试了它)

public void insert(int priority, int data) {
    Item item = new Item(priority, data);

    if (head == null) {
        head = item;
        item.setNext(null);
    } else {
        Item next = head;
        Item prev = next;

        do {
            if (priority > next.getPriority()) {
                // break and insert
                break;
            }
            prev = next;
            next = next.getNext();
        } while (next != null);

        item.setNext(next);
        if (item.getPriority() > head.getPriority()) {
            head = item;
        } else prev.setNext(item);
    }
}

您的插入方法存在以下问题:

prev = head;
head.setNext(head);
prev = pqItem;

这段代码甚至做了什么?这是它的作用:

bad code

您也没有考虑队列中有两个以上项目的情况。想象一下,队列中有5个项目。现在您要在队列中插入pqItempqItem优先级最低,因此会在队列末尾插入,对吧?因此,您需要遍历队列(列表)才能到达最后一个项目。