queue implementation does not return first element

Little :

I want to emulate a queue by using linked lists in Java. My general schema is to have a list of nodes, with two nodes that points to the first and last element of my queue. When I perform the dequeue() I want to get ride of the first element. So far what I have done is the following:

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;
        }
    }
}

I do not want to use double linked lists, so for the dequeue() operation what I do is to traverse my list with two pointers like this:

enter image description here

So when the current.next points to a null, I want that previous to be the first node. The problem that I got is when I print the elements of my queue it stills prints me: 10,15,5,18, but the 18 value is not deleted. Any help?

Thanks

Yassin Hajaj :

There are basically two things I would correct in your code. First of all, the Queue field was not assigned any value, and I also doubt its utility, basically its logic can be applied using first

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

The second one is that you never put the value of the new head of the queue next to null which is needed in that case

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;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=156413&siteId=1