我有一个有趣的情况:当我将一个节点添加到队列中时,只添加了两个节点。
以下是我如何将节点添加到队列中:
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();
}
如果需要其他信息,请与我们联系。 谢谢!
答案 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;
}
这会快得多