Fork me on GitHub

数据结构---双向链表

双向链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

具体实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDataStructures
{
    internal class DListNode<T>
    {
        public T value;
        public DListNode<T> Flink;
        public DListNode<T> Blink;

        public DListNode()
        {
            Flink = null;
            Blink = null;
        }

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

    public class DLinkList<T>
    {
        private DListNode<T> m_Head;
        private DListNode<T> m_End;

        private int m_Count;

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

         public DLinkList()
        {
            m_Head = new DListNode<T>();
            m_End = m_Head;
        }

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


        private DListNode<T> Find(T item)
        {
            DListNode<T> current = m_Head.Flink;
            while (current != null && !m_Comparer.Equals(item, current.value))
            {
                current = current.Flink;
            }
            return current;
        }

        private DListNode<T> FindPrevious(T item)
        {
            return Find(item).Blink;
        }


        public void Add(T item)
        {
            DListNode<T> current = new DListNode<T>(item);
            m_End.Flink = current;
            current.Blink = m_End;
            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!");

            DListNode<T> current = this.m_Head;
            DListNode<T> node = new DListNode<T>(item);
            while (index-- > 0)
            {
                current = current.Flink;
            }

            node.Flink = current.Flink;
            node.Blink = current;
            current.Flink.Blink = node;
            current.Flink = node;

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

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

        private DListNode<T> FindLast()
        {
            DListNode<T> current = m_Head;
            while (current.Flink != null)
                current = current.Flink;
            return current;
        }

        public void PrintReverse()
        {
            DListNode<T> current = new DListNode<T>();
            current = FindLast();
            while (current.Blink != null)
            {
                Console.WriteLine(current.value);
                current = current.Blink;
            }
        }

        public void PrintList()
        {
            DListNode<T> current = m_Head;
            while (current.Flink != null)
            {
                Console.WriteLine(current.Flink.value);
                current = current.Flink;
            }
        }
    }
}

posted @ 2010-03-07 14:40  idoku  阅读(359)  评论(0编辑  收藏  举报