链表

链表是一种物理上非连续、非顺序的存储结构,数据元素之间的顺序是通过每个元素的指针关联的。链表可以用来作为实现栈、队列等数据结构的基础。

        链表有一系列节点组成,每个节点一般至少会包含两部分的信息:(1)元素数据 (2)指向下一个元素的指针

        链表分类: (1)单向链表和双向链表  (2)静态链表(数组实现) 、动态链表(指针)

        链表的操作: 创建、插入、删除、输出

        链表的特点:

        (1)物理空间不连续,空间开销更大

        (2)在运行时可以动态添加

        (3)查找元素需要顺序查找

         动态链表的实现代码如下: 


namespace LinkedList
{
    class Node<T>
    {
        public T Data { get; set; }
        public Node<T> Next { get; set; }
        public Node() {

        }
        public Node(T obj) {
            this.Data = obj;
        }
        public override string ToString()
        {
            return Data.ToString();
        } 
    }
}
using System; 

namespace LinkedList
{
    class LinkedList<T>
    {
        private Node<T> head;
        public int count { get; private set; }
        public LinkedList()
        {
        }
        public LinkedList(T _head) {
            this.head = new Node<T>(_head);
        }
        //添加元素
        public virtual void Add(T value) {
            Node<T> newNode = new Node<T>(value);
            if (this.head == null)
            {
                this.head = newNode;
            }
            else {
                Node<T> lastNode = GetByIndex(count-1);
                lastNode.Next = newNode;
            }
            count++;
        } 
        //索引器
        public T this[int index] {
            get {
                return GetByIndex(index).Data;
            }
            set {
                GetByIndex(index).Data = value;
            }
        }
        //查找指定索引的元素
        private Node<T> GetByIndex(int index) {
            if (index < 0 || index >= this.count) {
                throw new ArgumentOutOfRangeException("index","索引超出范围");
            }
            Node<T> tempNode = this.head;
            for (int i = 0; i < index; i++)
            {
                tempNode = tempNode.Next;
            }
            return tempNode;
        }

        public virtual void Insert(int index, T value) {
            Node<T> newNode = new Node<T>(value);       //新节点
            //如果在开始位置插入
            if (index == 0)
            {
                if (this.head == null)
                {
                    this.head = newNode;
                }
                else
                {
                    newNode.Next = head;
                    this.head = newNode;
                }
            }
            else {
                Node<T> prevNode = GetByIndex(index - 1);       //查找插入点的前驱节点
                Node<T> nextNode = prevNode.Next;               //插入点的后继节点
                prevNode.Next = newNode;        //前驱节点的后继节点为新节点
                newNode.Next = nextNode;        //新节点的后继几点指向原来的前驱的后继
            }
            count++;
        }
        //根据索引删除元素
        public virtual void RemoveAt(int index) {
            //删除头结点
            if (index == 0)
            {
                if (this.head == null)
                {
                    throw new ArgumentOutOfRangeException("index", "索引超出范围");
                }
                this.head = head.Next;
            }
            else {
                //查找删除节点的前驱节点
                Node<T> prevNode = GetByIndex(index-1);
                if (prevNode.Next == null) {
                    throw new ArgumentOutOfRangeException("index","索引超出范围");
                }
                prevNode.Next = prevNode.Next.Next;
            }
            count--;
        }

        public override string ToString()
        {
            string s = "";
            Node<T> temp = head;
            while(temp != null) { 
                s += temp.ToString() + " ";
                temp = temp.Next;
            }
            return s;
        }
    }
}
using System; 
namespace LinkedList
{
    class Program
    {
        static void Main(string[] args)
        {
            LinkedList<int> lst = new LinkedList<int>();
            lst.Add(0);   //添加
            lst.Add(1);
            lst.Add(2);
            lst.Add(3);
            lst.Insert(2,50);    //插入
            Console.WriteLine(lst.ToString());    // 0 1 50 2 3
            lst.RemoveAt(1);        //删除
            lst[2] = 9;     //访问
            Console.WriteLine(lst.ToString());   //0 50 9 3

            Console.ReadKey();
        }
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值