c# - C#,关于 while 循环的 SingleLinkedList 问题
问题描述
我有几个问题...
所以我正在使用单链表,我在理解代码时遇到了一些问题。所以假设我有这样的事情:
public void addToEnd(int data)
{
Node p = start;
Node temp = new Node(data);
if (start == null)
{
start = temp;
return;
}
else
{
while(p.link != null)
{
p = p.link;
}
p.link = temp;
}
}
所以...此代码将在列表末尾添加节点。我明白了。让我们检查显示列表方法...
public void displayList()
{
Node p = start;
if (start == null)
{
Console.WriteLine("List is empty.");
return;
}
while(p != null)
{
Console.Write("|" + p.data + "| -> ");
p = p.link;
}
}
所以我关心的是......在 displayList 方法中,while 循环说 - ( while p != null )......我玩了一下,我把它改成了 - ( while p.link != null )。所以结果是它不会打印列表的最后一个元素。所以我得出结论 p.link 不是最后一个节点,而是之前的一个。它只是指列表的最后一个节点。因此,如果我的假设是正确的,那么 addToEnd(int data) 方法为什么工作得很好,如果该方法中的 wile 循环是 - ( while p.link != null ),它实际上是在末尾添加一些节点。当我将 while 循环点更改为列表的倒数第二个元素时,它不应该像 displayList() 方法那样吗?如果有人可以向我解释这一点,那将是惊人的。在此先感谢各位;)
解决方案
两种方法都是正确的,让我们分解元素:
- addToEnd将一个元素添加到链表的末尾
- displayList以 |{int}|-> 格式打印整个列表
- start似乎是一个定义列表第一个元素的类级别节点
- 该类
Node
具有Link
链接列表中下一个节点(不是最后一个)的属性
现在,如何displayList
工作?
- 声明一个
p
变量,该变量将具有该方法在任何给定时间使用的节点 - 检查
p
,现在它被分配了起始节点,是否为空,如果它为空,则显示一条消息并且方法结束,然后 - 当
p
(当前元素)不为空时,打印其值,然后分配给p
列表中的下一个元素,即p.Link
- 如果下一个元素为空,则
while
存在,这就是结束
这两种方法的区别在于addToEnd
检查下一个节点是否为 null 以分配data
为最后一个元素。displayList
在打印当前元素之前不能移动到下一个元素。
推荐阅读
- sql - Phoenix 中不支持 SQL Intersect ,可以替代 phoenix 中的 intersect 吗?
- django - 将 Django 默认模型值分配为外字段键的计数
- gitlab - Gitlab:是否可以过滤多个作者的合并请求?
- sql - 返回具有来自另一个表的值的列的值
- excel - 如何将数据从一张表复制到所有其他表
- selenium - 在 selenium ide 上上传文件后,谷歌浏览器会抛出“Aw snap”
- azure - 事件总线和大数据最佳实践
- java - 如何在请求中传递参数?
- mysql - MySQL - 如何使用变量名读取列值
- database - 将变更从开发环境迁移到生产环境