我正在尝试了解add方法如何运行ListQueue进行修订。任何帮助都感激不尽。我无法在网上找到任何完整的解释,遗憾的是我无法理解它。
private Cell frontCell,backCell;
@Override
public void add(char x) {
Cell newCell = new Cell(x);
if(frontCell == null){
frontCell = backCell = newCell;
}else{
backCell.next = newCell;
backCell = newCell;
}
}
还有一个内部类“Cell”
public class Cell{
char data;
Cell next;
public Cell(char data){
this.data = data;
next = null;
}
}
“frontCell”将Cell存储在队列的开头,“backCell”将Cell存储在后面。
“frontCell”引用“backCell”,其中包含刚刚添加的数据。然后,如果添加了另一个字符“backCell.next = newCell”和“backCell = newCell”。
如何存储队列中前后单元格之间的单元格?
如何将“frontCell”的引用设置为“backCell”?
答案 0 :(得分:1)
您的Cell类对于每个单元格都有data
,而next
则引用列表中的下一个单元格,这就是它们全部链接在一起的方式。
if(frontCell == null)
询问列表是否为空,如果是,则为frontCell = backCell = newCell;
,这意味着您要添加的新Cell是列表中唯一的单元格,因此它是{{1还有frontCell
。
backcell
如果列表不为空,else
您要添加的新单元格由backCell.next = newCell;
链接,而您的newCell是新的backCell(backCell
)。
尝试在纸上绘制类似这些数据结构可能更容易(如this excellent free Data Structures textbook节目),并尝试添加和删除一些单元格,遵循代码告诉您的情况。
答案 1 :(得分:0)
frontCell = backCell = newCell
行仅在frontCell
为空时触发,即当队列为空时触发。这是有道理的 - 当你向0元素队列添加一个元素时,它变成一个1元素的队列,所以前面和后面的单元格是相同的。
如果队列中已有单元格,则队列中的最后一个元素将其下一个指针指向最新添加,然后将新添加设置为后面。
空队列:
[]
/\
f b
添加一个元素
[E1]
/\ //front and back are pointing
f b
添加前的多元素队列:
[E1->E2->E3->(null)]
/ \
f b
添加后:
[E1->E2->E3->E4-null]
/ \
f b
答案 2 :(得分:0)
我不是专家,但我会尝试解释我理解它的方式。
创建队列时,它是空的,这意味着前单元格和后单元格都为空。
然后添加新单元格(单元格1)
Cell newCell = new Cell(x)
新单元格存储值x
,其下一个单元格为空,因为您没有在正面和背面之间插入,然后输入if,因为我说你的前单元格为空
if(frontCell == null){
frontCell = backCell = newCell;
}
这里新单元格是正面和背面,下一个单元格为空,因为没有其他项目。
这次添加另一个单元格(单元格2)时,不会触发if代码,因为front不再为null,因此执行的代码是
backCell.next = newCell;
backCell = newCell;
这里最后一个单元格(你唯一拥有的单元格)改变了它的下一个单元格,它先前为null,指向第二个单元格,然后引用后面的单元格,从第一个单元格改为第二个单元格。如果此时调试代码,则会有类似
的内容firstcell= Cell1
Cell1.next= Cell2
Cell2.next = null
back = Cell2
如果您添加另一个单元格,那么
firstcell= Cell1
Cell1.next= Cell2
Cell2.next = Cell3
Cell3.next=null
back = Cell3
我希望这可以帮助你做得更好