单个LinkedList是否在LIFO中提供输出?

时间:2010-10-05 16:14:09

标签: visual-studio c#-4.0

我正在制作一个单一链接列表。在创建自己的链表时,我对在自定义链表中打印节点集感到困惑。

我想知道,一个单一链接的列表是否以堆叠的LIFO方式显示其集合?

下面是我自己的LinkedList AND节点是A类,任何人都可以告诉我,Singular LinkedList以Lifo Manner打印集合。

class MYlinklist
{
    Node header;

    public void Add(int a)
    {
        Node n = new Node();
        n.element = a;
        n.Next = header;
        header = n;
    }

    public void Print()
    {
        Node n = new Node();
        n = header;
        while (n != null)
        {
            Console.WriteLine(n.element.ToString());
            n = n.Next;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果您指的是LinkedList<T>,答案取决于您添加新成员的方式。

如果您想让链接列表在LIFO中迭代,您可以通过始终使用AddFirst添加,并RemoveFirst删除来完成此操作。这将导致它的行为非常像堆栈。

然而,关于LinkedList<T>的好处是你可以添加任何地方inside of the list作为O(1)操作。


编辑:

如果您希望将其设为FIFO,则需要更改节点的添加方式,并将其添加到列表末尾,而不是开头:

class MyLinkedList
{
    Node header;
    Node last;

    public void Add(int a) 
    { 
        Node n = new Node(); 
        n.element = a; 
        n.Next = null; // We'll put this at the end...
        if (last == null)
        { 
            header = n;
            last = n;
        }
        else
        {
             last.Next = n;
             last = n;
        }
    } 

    public void Print() 
    { 
        Node n = new Node(); 
        n = header; 
        while (n != null) 
        { 
            Console.WriteLine(n.element.ToString()); 
            n = n.Next; 
        } 
    } 
}

答案 1 :(得分:0)

您在列表的开头添加节点(请注意您始终如何将node.Next设置到列表的开头。)

然后你从头部(插入的最后一个元素)到尾部迭代。

如果要按FIFO顺序迭代,则应执行以下操作:

  1. 保持对列表尾部的引用(以及您放入header的头部)。
  2. 添加节点时,将tail.Next设置为新节点,然后将tail设置为指向新节点。
  3. 您的迭代功能可以保持不变。
  4. 你的另一个选择是,不是保持对尾部的引用,而是每次都在列表中进行迭代。但这需要权衡需要通过n-1元素每次添加n元素,这意味着添加许多元素是O(n^2)操作。我不建议这样做,但如果您正在学习基础知识并且您不确定尾部引用操作,那么它可能会很好。但是,在生产代码中,您应始终为链接列表提供头部和尾部引用。