首页 > 解决方案 > 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() 方法那样吗?如果有人可以向我解释这一点,那将是惊人的。在此先感谢各位;)

标签: c#

解决方案


两种方法都是正确的,让我们分解元素:

  1. addToEnd将一个元素添加到链表的末尾
  2. displayList以 |{int}|-> 格式打印整个列表
  3. start似乎是一个定义列表第一个元素的类级别节点
  4. 该类Node具有Link链接列表中下一个节点(不是最后一个)的属性

现在,如何displayList工作?

  1. 声明一个p变量,该变量将具有该方法在任何给定时间使用的节点
  2. 检查p,现在它被分配了起始节点,是否为空,如果它为空,则显示一条消息并且方法结束,然后
  3. p(当前元素)不为空时,打印其值,然后分配给p列表中的下一个元素,即p.Link
  4. 如果下一个元素为空,则while存在,这就是结束

这两种方法的区别在于addToEnd检查下一个节点是否为 null 以分配data为最后一个元素。displayList在打印当前元素之前不能移动到下一个元素。


推荐阅读