Fork me on GitHub

数据结构---单链表

单链表

链表是被称为节点的类对象的群集。每一个节点通过一个引用链接到列表内的后继节点上。节点包括存储数据的字段和节点引用的字段。到另外一个节点的引用被称为是链接。

 

 

using System;
using System.Collections.Generic;

namespace DDataStructures
{
    internal class ListNode<T>
    {
        private T value;

        public ListNode()
        {
            Next = null;
        }

        public ListNode(T value)
            : this()
        {
            this.value = value;
        }

        public T Value
        {
            //只读
            get { return this.value; }
        }

        public ListNode<T> Next
        {
            get;
            set;
        }
    }

    public class LinkList<T>
    {
        private ListNode<T> m_Head;
        private ListNode<T> m_End;

        private int m_Count;

        EqualityComparer<T> m_Comparer = EqualityComparer<T>.Default;

        public LinkList()
        {
            m_Head = new ListNode<T>();
            m_End = m_Head;
        }

        public bool IsEmpty { get { return m_Head.Next == null; } }

        private ListNode<T> Find(T item,out int index)
        {
            ListNode<T> current = m_Head.Next;
            index = 0;

            while (current!=null&&!m_Comparer.Equals(item,current.Value))
            {
                current = current.Next;
                index++;
            }
            if (current == null) index = -1;
            return current;
        }

        private ListNode<T> FindPrevious(T item)
        {
            ListNode<T> current = m_Head;
            while (current.Next!=null&&!m_Comparer.Equals(item,current.Next.Value))
            {
                current = current.Next;
            }
            return current;
        }

        public void Add(T item)
        {
            ListNode<T> current = new ListNode<T>(item);
            m_End.Next = current;
            m_End = current;
            m_Count++;
        }

        public void Insert(int index, T item)
        {
            if (index < 0 || index >= this.m_Count)
                throw new ArgumentOutOfRangeException("index", index, "index value is out of range,please check!");

            ListNode<T> current = this.m_Head;
            ListNode<T> node = new ListNode<T>(item);
            while (index-- > 0) current = current.Next;
            node.Next = current.Next;
            current.Next = node;

            if (m_End.Next != null) m_End = node;
            m_Count++;
        }

        public void Remove(T item)
        {
            ListNode<T> p = FindPrevious(item);
            if (p.Next != null)
            {
                p.Next = p.Next.Next;
                m_Count--;
            }
        }

        public void PrintList()
        {
            ListNode<T> current = m_Head;
            while (current.Next!=null)
            {
                Console.WriteLine(current.Next.Value);
                current = current.Next;
            }
        }
    }
}

 

参考:http://blog.csdn.net/sukhoeing/archive/2007/10/18/1831657.aspx

posted @ 2010-03-06 21:52  idoku  阅读(368)  评论(0编辑  收藏  举报