克隆队列而不从原始队列中删除元素[Java]

时间:2018-02-24 15:17:40

标签: java queue

我正在尝试克隆队列而不从原始队列中删除元素。 我使用自己的Node类实现了一个Queue类(我只显示了只包含特定函数的Queue类):

public class Queue<T> 
{
    private Node<T> first;
    private Node<T> last;

    public Queue()
    {
        this.first = null;
        this.last = null;
    }
    public boolean isEmpty()
    {
        return this.first == null;
    }

    public void insert(T x)
    {
        if (this.last == null)
        {
            this.last = new Node<T>(x);
            this.first = this.last;
        }
        else
        {
            this.last.setNext(new Node<T>(x));
            this.last = this.last.getNext();
        }
    }
    public T remove()
    {
        T res = this.first.getInfo();
        this.first = this.first.getNext();
        if (this.first == null)
            this.last = null;
        return res;

    }
}

我尝试克隆的方式:

public static Queue<Integer> cloneQueue(Queue<Integer> q)
    {
        Queue<Integer> q1 = new Queue<Integer>();
        Queue<Integer> pos = q;
        while (!pos.isEmpty())
        {
            q1.insert(pos.remove());
        }
        return q1;
    }

克隆函数的问题是比较该行中的相同指针:

Queue<Integer> pos = q;

如何在不影响主函数原始队列的情况下解决问题?

1 个答案:

答案 0 :(得分:0)

您自己的Queue实施有特殊原因吗? 您可以简单地使用标准Java实现。如果您想拥有自己的界面,可以随时将java.util.Queue包装在自己的队列中。

public class Queue<T> {
    private java.util.Deque<T> queue = new ArrayDeque<>();

    public boolean isEmpty() {
        return this.queue.isEmpty();
    }

    public void insert(T x) {
        this.queue.offerLast(x);
    }

    public T remove() {
        return this.queue.poll();
    }

    public static <T> Queue<T> cloneQueue(Queue<T> q) {
        Queue<T> clone = new Queue<T>();
        clone.queue = new ArrayDeque<T>(q.queue);
        return clone;
    }
}