C#单向链表的实现

隐身守侯 提交于 2019-11-28 10:15:07

节点

class Node<T>
{
    private T       data; //数据域
    private Node<T> next; //引用域

    //数据域属性
    public T Data
    {
        get => data;
        set => data = value;
    }

    //引用域属性
    internal Node<T> Next
    {
        get => next;
        set => next = value;
    }

    //构造器
    public Node(T val, Node<T> p)
    {
        Data = val;
        Next = p;
    }

    //构造器
    public Node(Node<T> p)
    {
        Next = p;
    }

    //构造器
    public Node(T val)
    {
        Data = val;
    }

    //构造器
    public Node()
    {
        Data = default(T);
        Next = null;
    }
}

接口

	public interface IListDs<T>
	{
	    int  GetLength();              //求长度
	    void Clear();                  //清空操作
	    bool IsEmpty();                //判断线性表是否为空
	    void Append(T    item);        //附加操作
	    void Insert(T    item, int i); //插入操作
	    T    Delete(int  i);           //删除操作
	    T    GetElem(int i);           //取表元
	    int  Locate(T    value);       //按值查找
	}

实现

using System;

class LinkList<T> : IListDs<T>
{
    private Node<T> head; //单链表的头引用

    //头引用的属性
    internal Node<T> Head
    {
        get => head;
        set => head = value;
    }

    //构造器
    public LinkList()
    {
        head = null;
    }

    //在链表末尾添加元素
    public void Append(T item)
    {
        Node<T> q = new Node<T>(item);
        Node<T> p = new Node<T>();

        //头节点为空时直接修改头节点的引用
        if (head == null)
        {
            head = q;
            return;
        }

        p = head;

        //遍历至最后一个节点
        while (p.Next != null)
        {
            p = p.Next;
        }

        //将新元素挂载到末尾
        p.Next = q;
    }

    //清空链表
    public void Clear()
    {
        head = null;
    }

    //删除节点
    public T Delete(int i)
    {
        if (IsEmpty() || i < 1)
        {
            Console.WriteLine("链表为空或位置错误");
            return default(T);
        }

        Node<T> q = new Node<T>();

        //删除头节点
        if (i == 1)
        {
            q    = head;
            head = head.Next;
            return q.Data;
        }

        //遍历删除节点
        Node<T> p = head;
        int     j = 1;
        while (p.Next != null && j < i)
        {
            q = p;
            p = p.Next;
            ++j;
        }

        if (j == i)
        {
            q.Next = p.Next;
            return p.Data;
        }
        else
        {
            Console.WriteLine("位置不正确");
            return default(T);
        }
    }

    //取第i个元素
    public T GetElem(int i)
    {
        if (IsEmpty())
        {
            Console.WriteLine("链表为空");
            return default(T);
        }

        Node<T> p = new Node<T>();
        p = head;
        int j = 1;
        while (p.Next != null && j < i)
        {
            p = p.Next;
            ++j;
        }

        if (j == i)
        {
            return p.Data;
        }
        else
        {
            Console.WriteLine("位置不正确!");
        }

        return default(T);
    }

    //求链表的长度
    public int GetLength()
    {
        Node<T> p   = head;
        int     len = 0;
        while (p != null)
        {
            p = p.Next;
            ++len;
        }

        return len;
    }

    //插入节点
    public void Insert(T item, int i)
    {
        //插入位置小于1或链表为空时,不能插入
        if (IsEmpty() || i < 1)
        {
            Console.WriteLine("链表为空或位置错误");
            return;
        }

        //插入位置为1时,直接在头节点后添加。
        if (i == 1)
        {
            Node<T> q = new Node<T>(item);
            q.Next    = head.Next;
            head.Next = q;
            return;
        }

        //先遍历位置,再插入
        int     j = 1;
        Node<T> p = head;
        Node<T> r = new Node<T>();
        while (p.Next != null && j < i)
        {
            r = p;
            p = p.Next;
            ++j;
        }

        if (j == i)
        {
            Node<T> q = new Node<T>(item);
            Node<T> m = r.Next;
            r.Next = q;
            q.Next = m;
        }
    }

    //判断是否为空
    public bool IsEmpty()
    {
        return head == null;
    }

    //在单链表中查找值为value的节点
    public int Locate(T value)
    {
        if (IsEmpty())
        {
            Console.WriteLine("链表为空!");
            return -1;
        }

        Node<T> p = new Node<T>();
        p = head;
        int i = 1;
        while ((p.Next != null) && (!p.Data.Equals(value)))
        {
            p = p.Next;
            ++i;
        }

        if (p == null)
        {
            Console.WriteLine("不存在这样的节点");
            return -1;
        }
        else
        {
            return i;
        }
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!