令人困惑的队列实施

时间:2014-08-19 15:17:26

标签: java

我很难理解队列的这种实现,更具体地说是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;

2 个答案:

答案 0 :(得分:0)

以下是这些方法如何运作的分步示例。

<强>入队

<磷>氮
一(第一) - &gt;二 - &gt;三 - &gt;四(最后)//方法调用前的列表

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)