数据结构---双向链表
双向链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
具体实现:
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; } } } }
作 者:doku
出 处:http://www.cnblogs.com/kulong995/
关于作者:喜欢编程,喜欢美食,专注于.NET项目开发。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!