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

具体实现:
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项目开发。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!


浙公网安备 33010602011771号