IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity C#双向泛型链表 -> 正文阅读

[游戏开发]Unity C#双向泛型链表

双向链表中,添加了结点交换,结点移动的功能。还有一些其它的常用方法。

public class DoubleLinkedList<T> : IEnumerable<T> ,IEnumerator<T>
    {
        public class DoubleLinkedNode
        {
            public T Value;
            public DoubleLinkedNode Prior;
            public DoubleLinkedNode Next;

            public DoubleLinkedNode()
            {
                
            }
            public DoubleLinkedNode(T t)
            {
                Value = t;
            }
            public DoubleLinkedNode(DoubleLinkedNode another)
            {
                this.Value = another.Value;
                this.Prior = another.Prior;
                this.Next = another.Next;
            }

            public void AddPrior(DoubleLinkedNode another)
            {
                this.Prior = another;
                another.Next = this;
            }
            
            public void AddNext(DoubleLinkedNode another)
            {
                this.Next = another;
                another.Prior = this;
            }

            public void Clear()
            {
                Prior = null;
                Next = null;
            }
        }

        public DoubleLinkedNode Head;
        public DoubleLinkedNode End;

        public int Size
        {
            get { return _size; }
        }

        private int _size;
        private int _cursor = -1;
        private DoubleLinkedNode _cursorNode = null;
        object IEnumerator.Current => Current;

        public T Current
        {
            get { return _cursorNode.Value; }
        }
        

        public bool MoveNext()
        {
            _cursor++;
            if (_cursor == 0)
                _cursorNode = Head;
            else
                _cursorNode = _cursorNode.Next;
            return (_cursor < _size);
        }

        public void Reset()
        {
            _cursor = -1;
            _cursorNode = null;
        }


        public void Dispose()
        {
            ;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            Reset();
            return this;
        } 
        
        
        IEnumerator<T> IEnumerable<T>.GetEnumerator()
        {
            Reset();
            return this;
        }

        public DoubleLinkedList()
        {
            _size = 0;
        }

        public DoubleLinkedList(DoubleLinkedList<T> another)
        {
             _size = 0;
            foreach (var t in another)
            {
                PushBack(t);
            }
        }
        
        public T this[int index]
        {
            get
            {
                return Index(index).Value;
            }
            set
            {
                Index(index).Value = value;
            }
        }


        public static DoubleLinkedList<T> operator+ (DoubleLinkedList<T> b, DoubleLinkedList<T> c)
        {
            DoubleLinkedList<T> a = new DoubleLinkedList<T>(b);
            foreach (var t in c)
            {
                a.PushBack(t);
            }

            a._size = b._size + c._size;
            return a;
        }

        public bool Contain(T find)
        {
            int index = Find(find);
            if (index == -1)
                return false;
            return true;
        }

        public int Find(T find)
        {
            foreach (var t in this)
            {
                if (t.Equals(find))
                    return _cursor;
            }
            return -1;
        }

        private DoubleLinkedNode Index(int p)
        {
            if (p >= _size)
                return null;
            DoubleLinkedNode node = Head;
            while (p > 0)
            {
                node = node.Next;
                p--;
            }
            return node;
        }

        public void PushHead(T value)
        {
            DoubleLinkedNode node = new DoubleLinkedNode(value);
            if (Head != null)
                Head.AddPrior(node);
            else
                End = node;
            
            Head = node;
            _size++;
        }
        
        public void PushBack(T value)
        {
            DoubleLinkedNode node = new DoubleLinkedNode(value);
            if(End != null)
                End.AddNext(node);
            else
                Head = node;
            
            End = node;
            _size++;
        }
        
        public void PushAt(T value ,int index)
        {
            if (index > _size || index < 0)
                return;
            if (index == 0)
                PushHead(value);
            else if (index == _size)
                PushBack(value);
            else
            {
                DoubleLinkedNode node = new DoubleLinkedNode(value);
                DoubleLinkedNode next = Index(index);
                DoubleLinkedNode prior = Index(index - 1);
                next.AddPrior(node);
                prior.AddNext(node);
                _size++;
            }
        }

        public T PopBack()
        {
            if (_size <= 0)
                return default;
            DoubleLinkedNode node = End;
            if (node.Prior != null)
            {
                End = node.Prior;
                End.Next = null;
            }
            else
            {
                Head = null;
                End = null;
            }
            _size--;
            node.Clear();
            return node.Value;
        }
        
        public T PopHead()
        {
            if (_size <= 0)
                return default;
            DoubleLinkedNode node = Head;
            if (node.Next != null)
            {
                Head = node.Next;
                Head.Prior = null;
            }
            else
            {
                Head = null;
                End = null;
            }
            _size--;
            node.Clear();
            return node.Value;
        }
        
        public T PopAt(int index)
        {
            if (index > _size - 1 || index < 0)
                 return default;
            if (index == 0)
                return PopHead();
            else if (index == _size - 1)
                return PopBack();
            else
            {
                DoubleLinkedNode node = Index(index);
                node.Prior.Next = node.Next;
                node.Next.Prior = node.Prior;
                node.Clear();
                _size--;
                return node.Value;
            }
        }
        
        public void Pop(T value)
        {
            int i = Find(value);
            if (i <= -1)
                return ;
            PopAt(i);
        }

        public void MoveToBack(int index)
        {
            if(index < 0 || index >= _size)
                return;
            PushBack(PopAt(index));;
        }
        
        public void MoveToHead(int index)
        {
            if(index < 0 || index >= _size)
                return;
            PushHead(PopAt(index));
        }


        public void Switch(int a, int b)
        {
            if(a == b)
                return;
            if (a > b)
            {
                int temp = a;
                a = b;
                b = temp;
            }
            PushAt(PopAt(a),b - 1);
            PushAt(PopAt(b),a);
        }
        
        public bool IsHead<T>(T value)
        {
            if (Head == null)
                return false;
            if (Head.Value.Equals(value))
                return true;
            return false;
        }
        
        public bool IsEnd<T>(T value)
        {
            if (End == null)
                return false;
            if (End.Value.Equals(value))
                return true;
            return false;
        }
    }
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:17:25  更:2021-10-17 12:18:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:55:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码