我很难理解队列的这种实现,更具体地说是enqueue和dequeue方法。 无论我如何接近它,我都无法理解它。
class Node {
int val;
Node next;
Node(int x) {
val = x;
next = null;
}
}
class Queue{
Node first, last;
public void enqueue(Node n){
if(first == null){
first = n;
last = first;
}else{
last.next = n;
last = n;
}
}
public Node dequeue(){
if(first == null){
return null;
}else{
Node temp = new Node(first.val);
first = first.next;
return temp;
}
}
}
入队方法如何运作? 在这里,我们只是'忘记'最后一个对象,并将其设置为对象n:
last.next = n;
last = n;
如果我们只是第一次触摸Node,这怎么会出现。如何首先拥有一系列first.next
值?
Node temp = new Node(first.val);
first = first.next;
return temp;
答案 0 :(得分:0)
以下是这些方法如何运作的分步示例。
<强>入队强>
<磷>氮last.next = n; // Add n to the end of the queue
一(第一) - &gt;二 - &gt;三 - &gt;四(最后) - &gt; Ñ
last = n; // Update the last pointer - not modifying the list order
一(第一) - &gt;二 - &gt;三 - &gt;四 - &gt; n(最后)//方法调用后的列表
<强>出队强>
一(第一) - &gt;二 - &gt;三 - &gt;四(最后)//方法调用前的列表
Node temp = new Node(first.val);
一个(第一个,临时) - &gt;二 - &gt;三 - &gt;四(最后)
first = first.next;
一个(临时) - &gt;二(第一) - &gt;三 - &gt;四(最后)//方法调用后的列表
请注意,one
仍指向two
,但指向first
的指针已更新,因此无法再访问one
。
答案 1 :(得分:0)
队列由单个链表实现。第一个和最后一个只是两个&#34;指针&#34;,指向列表中的第一个和最后一个节点。
当调用enqueue时,它会将(追加)节点添加到列表中,当调用dequeue时,将弹出第一个节点。所以队列看起来像:
n->n->n->n->...n
linked list direction: ->
en/dequeue direction : <-
例如:
(first)F->2->3->L(last)
在enqueue(E):
之后
(first)F->2->3->L->E(last)
在dequeue():
之后
(first)2->3->L->E(last)
返回了节点F
。
(first == null)检查仅用于检查队列是否为空。
关于此部件代码,请检查以下注释:
Node temp = new Node(first.val); //create a new node tmp, same value with first, but without "next"
first = first.next; //make the 2nd (first.next) as new first
return temp; // return the new created node (tmp)