我有这个用于将对象推入堆栈的代码,我无法理解每一行的作用,如果有人可以解释为什么前一个节点(newNode.next)必须等于顶部,以及为什么然后让顶部等于新节点。
void push(AnyClass newbObj)
{
Node newNode = Node(newObj);
newNode.next = top;
top = newNode;
}
这看起来像一个链表实现。在链表中,每个项目都有一个指向列表中下一个项目的指针(引用)。
该变量top
似乎是对列表开头节点的引用,因此表示堆栈的顶部。
让我们假设列表开始看起来像这样:
item 1 -> item 2 -> etc...
^----top
第一行只是将参数转换为正确的类型,我们可以改为定义push()
取 aNode
并完全删除这一行。
由于我们想在前面插入新节点,首先我们需要确保它指向列表的其余部分,使用:
newNode.next = top; //Point newNode's 'next' field to the current top of the list
这给了我们一些看起来像这样的东西
newNode -> item 1 -> item 2 -> etc...
^----top
但是top
仍然指向旧项目,所以我们现在更新:
top = newNode; //Re-assign top to point to the new head of the list
现在列表如下所示:
newNode -> item 1 -> item 2 -> etc...
^----top
我们完成了。
让我分步骤为您解释:
- newNode 是使用代码创建的新节点
Node newNode = Node(newObj);
。您希望将其放在堆栈顶部(即推送)- 现在在堆栈顶部,您还有另一个名为 top 的节点。
- 您想将当前顶部节点向下推一级
您在以下代码中将新节点链接到当前顶部节点。
newNode.next = top
此后,您在以下代码中将新节点设为栈顶:
top = newNode
编辑
有些人强调第 4 行。
newNode.next = top
意味着newNode
有一个名为的变量next
这将存储
memory address
先前的 Top 节点。因此,如果我们想通过当前 Top 节点 (newNode
) 访问前一个顶级节点,我们可以通过以下方式轻松完成:
Node prevTopNode = (Node)top.next
我添加了一些评论,希望对您有所帮助。
void push(AnyClass newbObj)
{
Node newNode = Node(newObj); //create a new node of the stack containing the data (newbObj)
newNode.next = top; //the new node has thw prevois top of the stack the successor
top = newNode; //the new node is now the top of the tsack
}