C#实现链表zz

链表:链表是用一组任意的存储单元来存储线性表中的数据元素。为此,在存储数据元素时,除了存储数据元 素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像,称为结点(Node)。把存储据元素本身 信息的域叫结点的数据域,把存储与它相邻的数据元素的存储地址信息的域叫结点的引用域。

节点类:

代码
using System;
using System.Collections.Generic;
using System.Text;

namespace DateStructrues.Lists.Node
{
    
/// <summary>
    
/// 节点类。
    
/// </summary>
    
/// <typeparam name="T"></typeparam>
    public class DNode<T>
    {
        
#region Fields

        
//
        
//数据域
        
//
        T _data;

        
//
        
//地址域(下一个)
        
//
        DNode<T> _next;

        
//
        
//地址域(上一个)
        
//
        DNode<T> _prev;

        
#endregion

        
#region Constructor

        
/// <summary>
        
/// 构造器
        
/// </summary>
        
/// <param name="value"></param>
        public DNode(T value)
        {
            _data 
= value;
        }

        
/// <summary>
        
/// 构造器
        
/// </summary>
        
/// <param name="value"></param>
        
/// <param name="prev"></param>
        
/// <param name="next"></param>
        public DNode(T value, DNode<T> prev, DNode<T> next)
        {
            _data 
= value;
            _prev 
= prev;
            _next 
= next;
        }

        
/// <summary>
        
/// 构造器
        
/// </summary>
        public DNode() { }

        
#endregion

        
#region Properties

        
/// <summary>
        
/// 地址域属性(上一个)。
        
/// </summary>
        public DNode<T> Prev
        {
            
get
            {
                
return _prev;
            }
            
set
            {
                _prev 
= value;
            }
        }

        
/// <summary>
        
/// 地址域属性(下一个)。
        
/// </summary>
        public DNode<T> Next
        {
            
get
            {
                
return _next;
            }
            
set
            {
                _next 
= value;
            }
        }

        
/// <summary>
        
/// 数据域属性。
        
/// </summary>
        public T Data
        {
            
get
            {
                
return _data;
            }
            
set
            {
                _data 
= value;
            }
        }

        
#endregion
    }
}

链表:

代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace DateStructrues.Lists.Node
{
    
/// <summary>
    
/// 链表
    
/// </summary>
    
/// <typeparam name="T">数据类型</typeparam>
    public class LinkList<T> : IList<T>
    {
        
#region Fields

        
//
        
// 头节点
        
//
        Node<T> head;

        
//
        
// 尾节点
        
//
        Node<T> rear;

        
//
        
// 记录节点的个数
        
//
        int count;

        
#endregion

        
#region Methods

        
/// <summary>
        
/// 通过遍历,求链表的长度。
        
/// </summary>
        
/// <returns>长度</returns>
        public int GetCount()
        {
            
int count = 0;
            Node
<T> p = head;
            
while (p != null)
            {
                count
++;
                p 
= p.Next;
            }
            
return count;
        }

        
/// <summary>
        
/// 获得节点。
        
/// </summary>
        
/// <param name="index">索引</param>
        
/// <returns>对应的节点</returns>
        public Node<T> GetNodeByIndex(int index)
        {
            
if (index < 0)
            {
                
return null;
            }

            Node
<T> p = head;
            
int count = 0;
            
while (p != null)
            {
                
if (index == count)
                {
                    
return p;
                }
                count
++;
                p 
= p.Next;
            }
            
return null;
        }

        
/// <summary>
        
/// 复制
        
/// </summary>
        
/// <returns></returns>
        public LinkList<T> Copy()
        {
            LinkList
<T> tmp = new LinkList<T>();
            tmp.head 
= new Node<T>(head.Data);
            Node
<T> p1 = tmp.head;
            Node
<T> p2 = head.Next;

            
while (p2 != null)
            {
                Node
<T> tmpNode = new Node<T>(p2.Data);
                p1.Next 
= tmpNode;

                p1 
= p1.Next;
                p2 
= p2.Next;
            }

            
return tmp;
        }

        
/// <summary>
        
/// 倒序
        
/// </summary>
        public void Revers()
        {
            Node
<T> p = head.Next;
            Node
<T> q = new Node<T>();
            head.Next 
= null;
            
while (p != null)
            {
                q 
= p;
                p 
= p.Next;
                q.Next 
= head.Next;
                head.Next 
= q;
            }
        }

        
/// <summary>
        
/// 合并
        
/// </summary>
        
/// <param name="Ha"></param>
        
/// <param name="Hb"></param>
        
/// <returns></returns>
        public static LinkList<int> Merge(LinkList<int> Ha, LinkList<int> Hb)
        {
            LinkList
<int> Hc = new LinkList<int>();
            Node
<int> p = Ha.head;
            Node
<int> q = Hb.head;
            Node
<int> s = new Node<int>();
            Hc 
= Ha;
            Hc.head 
= null;
            
while (p != null && q != null)
            {
                
if (p.Data < q.Data)
                {
                    s 
= p;
                    p 
= p.Next;
                }
                
else
                {
                    s 
= q;
                    q 
= q.Next;
                }
                Hc.Add(s.Data);
            }
            
if (p == null)
            {
                p 
= q;
            }
            
while (p != null)
            {
                s 
= p;
                p 
= p.Next;
                Hc.Add(s.Data);
            }
            
return Hc;
        }

        
/// <summary>
        
/// 合并,由于同上一个合并方法签名相同,即不能重载
        
/// </summary>
        
/// <param name="Ha"></param>
        
/// <param name="Hb"></param>
        
/// <returns></returns>
        public static LinkList<int> Merge2(LinkList<int> Ha, LinkList<int> Hb)
        {
            LinkList
<int> Hc = new LinkList<int>();
            Node
<int> p = Ha.head;
            Node
<int> q = Hb.head;
            Node
<int> s = new Node<int>();
            Hc 
= Ha;
            Hc.head 
= null;
            
//两个表非空
            while (p != null && q != null)
            {
                
if (p.Data < q.Data)
                {
                    s 
= p;
                    p 
= p.Next;
                }
                
else
                {
                    s 
= q;
                    q 
= q.Next;
                }
                s.Next 
= Hc.head;
                Hc.head 
= s;
            }
            
//第2个表非空而第1个表为空
            if (p == null)
            {
                p 
= q;
            }
            
//将两表中的剩余数据元素附加到新表的末尾
            while (p != null)
            {
                s 
= p;
                p 
= p.Next;
                s.Next 
= Hc.head;
                Hc.head 
= s;
            }
            
return Hc;
        }

        
/// <summary>
        
/// 取消
        
/// </summary>
        
/// <param name="Ha"></param>
        
/// <returns></returns>
        public static LinkList<int> Purge(LinkList<int> Ha)
        {
            LinkList
<int> Hb = new LinkList<int>();
            Node
<int> p = Ha.head;
            Node
<int> q = new Node<int>();
            Node
<int> s = new Node<int>();
            s 
= p;
            p 
= p.Next;
            s.Next 
= null;
            Hb.head 
= s;
            
while (p != null)
            {
                s 
= p;
                p 
= p.Next;
                q 
= Hb.head;
                
while (q != null && q.Data != s.Data)
                {
                    q 
= q.Next;
                }
                
if (q == null)
                {
                    s.Next 
= Hb.head;
                    Hb.head 
= s;
                }
            }
            
return Hb;
        }

        
#endregion

        
#region Properties

        
/// <summary>
        
/// 数组模式,主要用于调试时查看。
        
/// </summary>
        public T[] ArrayMode
        {
            
get
            {
                T[] arr 
= new T[Count];
                Node
<T> p = head;
                
int count = 0;
                
while (p != null)
                {
                    arr[count] 
= p.Data;
                    p 
= p.Next;
                    count
++;
                }
                
return arr;
            }
        }

        
#endregion

        
#region IList<T> 成员

        
/// <summary>
        
/// 求元素所在的索引。
        
/// </summary>
        
/// <param name="item">要查找的元素</param>
        
/// <returns>所在索引</returns>
        public int IndexOf(T item)
        {
            
// 用于遍历链表
            Node<T> p = head;

            
// 计数器
            int count = 0;

            
while (p != null)
            {
                
if (p.Data.Equals(item))
                {
                    
return count;
                }

                count
++;

                
// 移到下一个节点
                p = p.Next;
            }
            
return -1;
        }

        
/// <summary>
        
/// 插入元素。
        
/// </summary>
        
/// <param name="index">索引</param>
        
/// <param name="item">要插入的项</param>
        public void Insert(int index, T item)
        {
            
int count = 1;
            Node
<T> p = head;
            Node
<T> v = new Node<T>(item);
            
if (index == 0)
            {
                
if (head == null)
                {
                    rear 
= v;
                }

                v.Next 
= head;
                head 
= v;
                
this.count++;
                
return;
            }

            
while (p != null)
            {
                
if (count == index)
                {
                    
if (p.Next == null)
                        rear 
= v;
                    v.Next 
= p.Next;
                    p.Next 
= v;

                    
this.count++;
                    
break;
                }
                p 
= p.Next;
                count
++;
            }
        }

        
/// <summary>
        
/// 以索引方式删除元素
        
/// </summary>
        
/// <param name="index">索引</param>
        public void RemoveAt(int index)
        {
            
int count = 0;
            
if (index == 0)
            {
                head 
= head.Next;
                
this.count--;
                
return;
            }
            Node
<T> p = head;
            Node
<T> prev = head;
            
while (p != null)
            {
                
if (count == index)
                {
                    prev.Next 
= p.Next;
                    
this.count--;
                    
if (p.Next == null)
                    {
                        rear 
= prev;
                    }
                    
break;
                }
                prev 
= p;
                p 
= p.Next;
                count
++;
            }
        }

        
/// <summary>
        
/// 以索引方式访问
        
/// </summary>
        
/// <param name="index">索引</param>
        
/// <returns>对应的元素</returns>
        public T this[int index]
        {
            
get
            {
                
try
                {
                    Node
<T> p = GetNodeByIndex(index);
                    
return p.Data;
                }
                
catch (NullReferenceException)
                {
                    
throw new IndexOutOfRangeException("索引超出数组界限。");
                }
            }
            
set
            {
                
try
                {
                    Node
<T> p = GetNodeByIndex(index);
                    p.Data 
= value;
                }
                
catch (NullReferenceException)
                {
                    
throw new IndexOutOfRangeException("索引超出数组界限。");
                }
            }
        }

        
#endregion

        
#region ICollection<T> 成员

        
/// <summary>
        
/// 向链表末尾,追加元素
        
/// </summary>
        
/// <param name="item">要追加的元素</param>
        public void Add(T item)
        {
            Node
<T> p = new Node<T>(item);

            
if (head == null)
            {
                head 
= p;

                
// 将这个节点设为末尾。
                rear = p;

                
this.count = 1;
                
return;
            }

            rear.Next 
= p;
            rear 
= p;

            count
++;
        }

        
/// <summary>
        
/// 清空
        
/// </summary>
        public void Clear()
        {
            head 
= null;
            rear 
= null;
        }

        
/// <summary>
        
/// 是否包含元素
        
/// </summary>
        
/// <param name="item">检查是否包含的元素</param>
        
/// <returns>是否存在</returns>
        public bool Contains(T item)
        {
            
int index = IndexOf(item);
            
return (index != -1);
        }

        
/// <summary>
        
/// 将数据拷贝到数组
        
/// </summary>
        
/// <param name="array">准备的数组</param>
        
/// <param name="arrayIndex">开始的索引</param>
        public void CopyTo(T[] array, int arrayIndex)
        {
            ArrayMode.CopyTo(array, arrayIndex);
        }

        
/// <summary>
        
/// 获得此链表的元素个数
        
/// </summary>
        public int Count
        {
            
get
            {
                
return GetCount();
            }
        }

        
/// <summary>
        
/// 获得是否是只读。
        
/// </summary>
        public bool IsReadOnly
        {
            
get
            {
                
return false;
            }
        }

        
/// <summary>
        
/// 删除元素
        
/// </summary>
        
/// <param name="item">将要被删除的元素</param>
        
/// <returns>是否成功删除</returns>
        public bool Remove(T item)
        {
            Node
<T> prev = null;
            Node
<T> p = head;

            
while (p != null)
            {
                
if (p.Data.Equals(item))
                {
                    
if (prev != null)
                        prev.Next 
= p.Next;
                    
else
                        head 
= head.Next;

                    
this.count--;
                    
return true;
                }
                prev 
= p;
                p 
= p.Next;

            }
            
return false;
        }

        
#endregion

        
#region IEnumerable<T> 成员

        
public IEnumerator<T> GetEnumerator()
        {
            
throw new Exception("The method or operation is not implemented.");
        }

        
#endregion

        
#region IEnumerable 成员

        IEnumerator IEnumerable.GetEnumerator()
        {
            
throw new Exception("The method or operation is not implemented.");
        }

        
#endregion
    }
}


原文地址:https://www.cnblogs.com/end/p/1766390.html