如何在c#中将节点添加到单个链表

时间:2016-01-10 22:53:19

标签: c# .net algorithm linked-list singly-linked-list

我已经开始学习C#中的算法了。我一直在尝试自己创建一个链表算法(只是为了好玩)。但我有一个问题。我想知道,如何将节点添加到列表中?现在我有三个与节点交互的方法,但列表是空的,所以没有任何反应。

节点类

class Node {
    public int info;
    public Node link;

    public Node (int i)
    {
        info = i;
        link = null;
    }
}

SingleLinkedList类

class SingleLinkedList {
    private Node start;

    public SingleLinkedList ()
    {
        start = null;
    }

    public void CreateList() {
        //TODO: Create the linked list here
    }

    public void DisplayList() {
        Node p;
        if (start == null) {
            Console.WriteLine ("Your list is empty, idiot");
            return;
        }
        Console.WriteLine ("List is :  ");
        p = start;
        while (p != null) {
            Console.WriteLine (p.info + " ");
            p = p.link;
        }
        Console.WriteLine ();
    }

    public void CountNodes() {
        int n = 0;
        Node p = start;
        while (p != null) {
            n++;
            p = p.link;
        }
        Console.WriteLine ("Number of nodes in list is = " + n);
    }

    public bool Search (int x) {
        int position = 1;
        Node p = start;
        while (p != null) {
            if (p.info == x)
                break;
            position++;
            p = p.link;
        }
        if (p == null) {
            Console.WriteLine (x + "not found in list because use an idiot");
        } else {
            Console.WriteLine (x + "is at position " + position);
            return true;
        }
        return false;
    }
}

主要

int choice, data;

SingleLinkedList list = new SingleLinkedList ();

Console.WriteLine ("1.Display List");
Console.WriteLine ("2.Count Nodes");
Console.WriteLine ("search for an integer");

Console.WriteLine ("Enter your choice master: ");
choice = Convert.ToInt32 (Console.ReadLine ());

switch (choice) {

case 1:
    list.DisplayList ();
    break;

case 2:
    list.CountNodes ();
    break;

case 3:
    Console.WriteLine ("Enter the element to be searched");
    data = Convert.ToInt32 (Console.ReadLine ());
    list.Search (data);
    break;

default:
    break;
}

如何在SingleLinkedList类中实现CreateList方法以将节点添加到列表中?

2 个答案:

答案 0 :(得分:4)

单链接列表模式维护指向第一个节点的指针/引用,每个项目包含指向列表中下一个节点的指针/引用。附加到列表意味着找到空引用 - 无论是根引用还是链的末尾 - 并使用对新节点的引用填充它:

public void Append(Node value)
{
    // check if we are adding to an empty list
    if (start == null)
        start = value;
    else
    {
        // find the last valid node
        Node curr;
        for (curr = start; curr.link != null; curr = curr.link);
        // add the item
        curr.link = value;
    }
}

这样做的缺点是,列表中的项目越多,找到添加下一个项目的结尾所需的时间就越长。换句话说,它是O(N)操作,当您一次添加数千个项目时,真正重要。对于任何多达一百件左右的物品,您可能都不会注意到它,但尝试在该列表中添加100,000件物品。

幸运的是,只需跟踪列表中的最后一项 - 尾部,就可以将列表上的追加操作简化为O(1)。

public class SingleLinkedList
{
    Node head;
    Node tail;

    public void Append(Node value)
    {
        if (head == null)
            head = value;
        else
            tail.link = value;
        tail = value;
    }
}

现在,您可以以相同的速度(给予或花费几微秒)将项目添加到百万项目列表中作为列表,其中没有任何内容。您只需记得在从列表中删除项目时更新tail

至于搜索等,您可以实现IEnumerable并使用LINQ完成所有工作。或添加为您执行此操作的Items属性:

public IEnumerable<int> Items
{
    get 
    {
        for (var next = head; next != null; next = next.link)
            yield return next.value;
    } 
}

现在,您可以使用以下内容测试列表中存在的项目:

if (list.Items.Any(i => i == somevalue))
{
}

答案 1 :(得分:0)

public void AddNodeToList(Node nodeToBeAdded)
    {
        Node temp = null;
        if (start == null)
        {
            start = nodeToBeAdded;
        }
        else
        {
            temp = start;
            while (temp.link != null)
            {
                temp = temp.link;
            }

            temp.link = nodeToBeAdded;
        }

        nodeToBeAdded.link = null;
    }


 public void CreateList(Node[] nodesToBeAdded)
    {
        foreach (Node item in nodesToBeAdded)
        {
            this.AddNodeToList(item);
        }
    }