将节点添加到链接列表的前面

时间:2017-05-10 12:33:23

标签: c# data-structures

我正在使用一个简单的链接列表。我正在尝试创建一个方法,将项目插入到我的链接列表的前面。

此方法有效:

// Works
public static LinkedListNode AddItemAtFrontWorkingVersion(LinkedListNode node, int value)
{
  var newNode = new LinkedListNode(value);
  newNode.next = node;
  return newNode;
}

被叫:

LinkedListNode a = new LinkedListNode(5);
a = LinkedListNode.AddItemAtFrontWorkingVersion(a, 99);

现在我有一个不同的版本,它不起作用,我无法弄清楚原因。该列表是一个对象,所以它应该在堆上,为什么我只能设置到新节点。当方法返回时,它不会更改。

问题:为什么我必须返回节点为什么我不能像在AddItemAtEnd那样分配它?

// Does Not work
public static void AddItemAtFront(LinkedListNode node, int value)
{
    var newNode = new LinkedListNode(value);
    newNode.next = node;
    node = newNode;
}

被叫:

LinkedListNode a = new LinkedListNode(5);
LinkedListNode.AddItemAtFront(a, 99);

完整代码:

using System;

namespace DataStructure
{

    public class LinkedListNode
    {

        public int value;
        public LinkedListNode next;

        public LinkedListNode(int value)
        {
            this.value = value;
        }

        public static void AddItemAtEnd(LinkedListNode node, int value) {

            var list = node.next;

            while (node.next != null)
            {
                node = node.next;                
            }
            node.next = new LinkedListNode(value);
        }

        // Does Not work
        public static void AddItemAtFront(LinkedListNode node, int value)
        {
            var newNode = new LinkedListNode(value);
            newNode.next = node;
            node = newNode;
        }

        // Works
        public static LinkedListNode AddItemAtFrontWorkingVersion(LinkedListNode node, int value)
        {
            var newNode = new LinkedListNode(value);
            newNode.next = node;
            return newNode;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            LinkedListNode a = new LinkedListNode(5);
            LinkedListNode.AddItemAtFront(a, 99);
            a = LinkedListNode.AddItemAtFrontWorkingVersion(a, 99);
            LinkedListNode.AddItemAtEnd(a, 9);
            LinkedListNode.AddItemAtEnd(a, 10);
            LinkedListNode.AddItemAtEnd(a, 11);
            LinkedListNode.AddItemAtEnd(a, 12);
            LinkedListNode.AddItemAtFront(a, 99);

            a = LinkedListNode.AddItemAtFrontWorkingVersion(a, 99);
            Console.Read();
        }  
    }
}

1 个答案:

答案 0 :(得分:1)

您按价值传递LinkedListNode。要使您的第二个版本正常工作,您必须通过引用传递它。

public static void AddItemAtFront(ref LinkedListNode node, int value)
{
    var newNode = new LinkedListNode(value);
    newNode.next = node;
    node = newNode;
}

可在文档中找到更多详细信息:Passing Reference-Type Parameters