Java Double Ended Queue toString方法覆盖左元素

时间:2018-02-02 14:08:35

标签: java collections queue deque

我创建了一个双端队列,我想打印出队列中的内容。我创建了一个toString方法,但是当我向左边添加一个元素时,它会覆盖当前的前(左)元素。 例如

 System.out.println(myDeq);
 myDeq.addFront(7);
 myDeq.addRight(12);
 System.out.println(myDeq);
 myDeq.addFront(15);
 System.out.println(myDeq);

所以我的输出将是

<>
<7,12>
<15,12>

但我想要

<15,7,12>

我的toString方法是:

public String toString()
    { StringBuffer sb = new StringBuffer("<");
        QCell<T> l = frontCell;
        QCell<T> r = backCell;
        while (l != null && r != null)
        { sb.append(l.data +"," + r.data + ",");
            l = l.next;
            r = r.next;
        }
        return(sb+">");
    }

我对左侧代码的添加是:     @override

public void addFront(T x) {
    QCell<T> theCell= new QCell<T>(x);
    if (frontCell == null)
        frontCell = backCell = theCell;
    else {
        frontCell.next = theCell;
        frontCell = theCell;
    }
}

我不确定是否是我的toString方法覆盖它或者我的addFront代码是不正确的。

2 个答案:

答案 0 :(得分:1)

你的addFront是错误的,因为你将frontCell设置为theCell。但随后重新分配了frontCell成为凯尔。所以原来的frontCell不再存在了。首先将它保存在tempCell中。

public void addFront(T x) {
    QCell<T> theCell= new QCell<T>(x);
    QCell<T> tempCell;
    if (frontCell == null)
        frontCell = backCell = theCell;
    else {
        tempCell = frontCell;
        frontCell = theCell;
        frontCell.next = tempCell;
    }
}

你的backCell也将是lastCell,所以不要做r = r.next;,因为它应该永远为null;它应该是r.previous

而是像这样使用从前到后穿过的单面循环。

public String toString()
    { StringBuffer sb = new StringBuffer("<");
        QueueCell<T> l = frontCell;
        while (l != null)
        { sb.append(l.data +",");
            l = l.next;
        }

        return(sb+">");
    }

答案 1 :(得分:0)

不应该这样:

frontCell.next = theCell;

是这样吗?

theCell.next = frontCell;