(C#)一个最简单的链表类

一、关于C#链表

C#链表可用类LinkedList来存放。本文中的类MyLinkedList只是实现了该类的最基本的功能。C#中没有指针,但因为C#中类在赋值时传递的是地址,因此仍然可以利用这点制作一个链表。

二、结点类Node和链表类MyLinkedList代码

/// <summary>
/// 链表结点
/// </summary>
class Node
{
    //结点数据,前后结点
    public object Data;
    public Node PreviousNode;
    public Node NextNode;

    //构造函数
    public Node(object data = null)
    {
        Data = data;
        PreviousNode = null;
        NextNode = null;
    }

    //输出结点信息
    public override string ToString()
    {
        return Data.ToString();
    }
}

/// <summary>
/// 链表类
/// </summary>
class MyLinkedList
{
    //首结点、尾结点
    public Node First;
    public Node Last;

    //下一个结点、上一个结点
    public Node NextNode(Node n) { return n.NextNode; }
    public Node PreviousNode(Node n) { return n.PreviousNode; }

    //结点总数
    public int Count;

    //构造函数
    public MyLinkedList()
    {
        this.First = null;
        this.Last = null;
        Count = 0;
    }

    /// <summary>
    /// 在结点node1之后增加结点node2,如果没有该结点则在最后增加
    /// </summary>
    /// <param name="node1">结点1</param>
    /// <param name="node2">结点2</param>
    public void AddAfter(Node node1, Node node2)
    {
        //链表为空的情况
        if (First == null)
        {
            Console.WriteLine("Linked-list is null! Can not find node1(" + node1 + ")");
            return;
        }

        Node temp = First;
        do
        {
            if (temp.Data.Equals(node1.Data))
            {
                //如果node1是尾结点
                if (node1.NextNode == null)
                {
                    node2.NextNode = null;
                    node2.PreviousNode = node1;
                    node1.NextNode = node2;
                }
                else //如果node1不是尾结点
                {
                    node2.NextNode = node1.NextNode;
                    node2.PreviousNode = node1;
                    node2.NextNode.PreviousNode = node2;
                    node1.NextNode = node2; ;
                }

                Count++;
                Console.WriteLine("Node(" + node2 + "): Add Complete!");
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);

        Console.WriteLine("Can not find node(" + node1 + "), Misson defeat");
    }

    /// <summary>
    /// 在链表尾部增加结点
    /// </summary>
    public void AddLast(Node node)
    {
        //链表为空的情况
        if (this.First == null) 
        {
            node.NextNode = null;
            node.PreviousNode = null;

            this.First = node;
            this.Last = node;
        }
        else //链表不为空的情况
        {
            Node temp = First;
            while(temp.NextNode != null)
            {
                temp = temp.NextNode;
            }

            temp.NextNode = node;
            node.PreviousNode = temp;

            Last = node;
        }

        Count++;
        Console.WriteLine("Node(" + node + "): Add Complete!");
    }

    /// <summary>
    /// 删除指定结点
    /// </summary>
    /// <param name="node">被删除结点</param>
    public void Delete(Node node)
    {
        if (Count == 0)
        {
            Console.WriteLine("Can not find node(" + node + ")");
            return;
        }

        Node temp = First;
        do
        {
            //如果数据部分匹配,则删去该结点
            if (temp.Data.Equals(node.Data))
            {
                //temp是尾结点
                if (temp.NextNode == null)
                {
                    temp.PreviousNode.NextNode = null;
                    temp = null;
                }
                else //temp不是尾结点 
                {
                    temp.PreviousNode.NextNode = temp.NextNode;
                    temp.NextNode.PreviousNode = temp.PreviousNode;
                    temp = null;
                }

                Count--;
                Console.WriteLine("Node(" + node + "): Delete Complete!");
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);

        Console.WriteLine("Can not find node(" + node + "), Misson defeat");
    }

    /// <summary>
    /// 修改结点值
    /// </summary>
    /// <param name="node">被修改结点</param>
    /// <param name="value">结点值</param>
    public void Modify(Node node, object value)
    {
        if (Count == 0)
        {
            Console.WriteLine("Can not find node(" + node + ")");
            return;
        }

        Node temp = First;
        do
        {
            if (temp.Data.Equals(node.Data))
            {
                Console.WriteLine("Node: " + temp.Data + " → " + value.ToString());
                temp.Data = value;
                return;
            }

            temp = temp.NextNode;
        }
        while (temp != null);
    }

    /// <summary>
    /// 打印链表
    /// </summary>
    public void Print()
    {
        if (First == null)
        {
            Console.WriteLine("No nodes in this linked-list.");
            return;
        }
        else
        {
            Console.WriteLine("Print the linked-list...");
            Node temp = First;
            do
            {
                Console.WriteLine(temp.ToString());
                temp = temp.NextNode;
            }
            while (temp != null);
            Console.WriteLine("Mission Complete!");
        }
    }
}

三、Main函数的调用示例

static void Main(string[] args)
{

    MyLinkedList ll = new MyLinkedList();

    //添加三个结点 1 2(在1后) 3(在2后)
    Node n1 = new Node("node1");            
    Node n2 = new Node("node2");
    Node n3 = new Node("node3");
            
    ll.AddLast(n1);
    ll.AddLast(n2);
    ll.AddLast(n3);

    //添加三个结点 1.5(在1后) 2.5(在2后) 3.5(在3后)
    Node n1dot5 = new Node("node1dot5");
    Node n2dot5 = new Node("node2dot5");
    Node n3dot5 = new Node("node3dot5");

    ll.AddAfter(n1, n1dot5);
    ll.AddAfter(n2, n2dot5);
    ll.AddAfter(n3, n3dot5);

    Console.WriteLine("========================");

    //打印链表
    ll.Print();

    Console.WriteLine("========================");

    //删除结点 2 和 3,将结点 2.5 的值改为 "ThisNodeIsModified!"
    ll.Delete(n2);
    ll.Delete(n3);
    ll.Modify(n2dot5, "ThisNodeIsModified!");

    Console.WriteLine("========================");

    //打印链表
    ll.Print();

    Console.ReadLine();
}

四、运行结果

231936_Ftqz_1425762.png

转载于:https://my.oschina.net/Tsybius2014/blog/277453

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值