Java - 分配节点的问题

时间:2014-02-16 06:07:22

标签: java nodes

我有一个有趣的情况:当我将一个节点添加到队列中时,只添加了两个节点。

以下是我如何将节点添加到队列中:

Queue queue = new Queue();
Node a = new Node("1");
Node b = new Node("2");
Node c = new Node("3");
Node d = new Node("4");

queue.add(a);
queue.add(b);
queue.add(c);
queue.add(d);

现在,这是add方法:

public void add(Node newNode)
{
    // assigning first Node
    if (head == null){
        head = newNode;
    return;
    }

    // since first Node assigned, assigning second one
    if (head.next == null){
        head.next = newNode;
    }
}

打印:

1
2

我想要打印所有这些,但只打印前两个。此外,它就像堆栈,但FIFO,而不是LIFO。

如果它有帮助,这是打印:

public void print()
{
    Node p;
    // Display all the nodes in the stack
    for( p = head; p != null; p = p.next )
        p.print();
}

如果需要其他信息,请与我们联系。 谢谢!

4 个答案:

答案 0 :(得分:1)

您需要递归方法:

public void add(Node newNode) {
    // assigning first Node
    if (next == null) {
        next = newNode;
    } else {
        next.add(newNode); // recursive call
    }
}

此方法沿着节点链走,直到找到尾部,然后在那里添加节点。

第一个电话是对头:

head.add(newNode);

该方法的递归形式将处理其余部分。

您只需从队列的头部开始更新头部 - 您可以将头部更新为head.next

答案 1 :(得分:1)

Queue是FIFO数据结构,添加到队列的第一个元素将是第一个要删除的元素。在队列中,您可以在从头部移除元素时从后端添加元素。每次添加元素时,只需移动后指针,在移除元素时,需要移动头指针。

试试这个:

public void add(Node newNode)
{
    // assigning first Node
    if (head == null){
        head = newNode;
        rear = newNode;
        return;
    }

    // since first Node assigned, use rear pointer for assignment
    rear.next=newNode;
    rear = newNode;
}

答案 2 :(得分:0)

如果仔细查看代码,则只更新头部及其下一个指针。

解决方案是包含一个名为current的辅助指针,您可以将current.next更新为newNode,然后将current设置为newNode

答案 3 :(得分:0)

问题在于此代码

// since first Node assigned, assigning second one
if (head.next == null){
    head.next = newNode;
}

当没有第二个节点时,你总是只会分配第二个节点,它不适用于第三个节点,依此类推,将其改为:

// since first Node assigned, assigning next one
Node x = head;    // Start from head
while(x.next != null){
    x = x.next;   // Find the last node in the queue
}
x.next = newNode;  // Link the new node to the last node

另一个简化是始终保持指向队列中最后一个节点的指针。所以你可以用以下代码替换上面的代码:

public void add(Node newNode)
{
    // assigning first Node
    if (head == null){
        head = last = newNode;
        return;
    }

    // since first Node assigned, assigning to end of queue
    last.next = newNode
    last = last.next;
}

这会快得多