队列实现不返回第一个元素

时间:2019-05-26 20:35:53

标签: java

我想通过使用Java中的链接列表来模拟队列。我的一般模式是有一个节点列表,其中两个节点指向队列的第一个和最后一个元素。当我执行dequeue()时,我想乘坐第一个元素。到目前为止,我已经完成了以下工作:

public class Node {
    public Object e;
    Node next;

    public Node(Object e) {
        this.e = e;
    }
}

public class Queue {
    Node queueList;
    Node first, last;
    int count;

    public void enQueue(Object n) {
        Node temp = new Node(n);
        temp.next = last;
        last = temp;
        if (queueList == null) {
            first = temp;
        }
        count++;
        queueList=temp;
    }

    public Object deQueue() {
        Node previous = last;
        Node current = last.next;
        Object num = null;
        if (count == 0)
            System.out.println("empty queue");
        else {
            while (current.next != null) {
                previous = previous.next;
                current = current.next;
            }
            num = first.e;
            first = previous;
            count--;
        }
        return num;
    }

    public void print() {
        Node current = last;
        while (current != null) {
            System.out.println(current.e);
            current = current.next;
        }
    }
}

我不想使用双链表,因此对于dequeue()操作,我要做的是用两个指针遍历我的列表,如下所示:

enter image description here

因此,当current.next指向null时,我希望前一个成为第一个节点。我遇到的问题是,当我打印队列中的元素时,它仍然打印出我:10、15、5、18,但18值未删除。有帮助吗?

谢谢

1 个答案:

答案 0 :(得分:1)

基本上,我会在您的代码中纠正两件事。 首先,Queue字段没有分配任何值,我也怀疑它的效用,基本上可以使用first

来应用其逻辑。
public void enQueue(Object n) {
    Node temp = new Node(n);
    temp.next = last;
    last = temp;
    if (first == null) { <--- HERE
        first = temp;
    }
    count++;
}

第二个问题是,您永远不要将队列新头的值放在null旁边,在这种情况下需要

public Object deQueue() {
    Node previous = last;
    Node current = last.next;
    Object num = null;
    if (count == 0) System.out.println("empty queue");
    else {
        while (current.next != null) {
            previous = previous.next;
            current = current.next;
        }
        num = first.e;
        first = previous;
        first.next = null; <--- HERE
        count--;
    }
    return num;
}