数据结构---循环单链表
循环链表
循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。
具体代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DDataStructures
{
internal class RListNode<T>
{
public T value;
public RListNode<T> next;
public RListNode()
{
this.next = null;
}
public RListNode(T value)
: this()
{
this.value = value;
}
}
public class RLinkList<T>
{
private RListNode<T> m_Head;
private RListNode<T> m_End;
private int m_Count;
public RLinkList()
{
m_Head = new RListNode<T>();
m_Head.next = m_Head;
m_End = m_Head;
m_End.next = m_Head;
m_Count = 0;
}
EqualityComparer<T> m_Comparer = EqualityComparer<T>.Default;
public bool IsEmpty { get { return m_Head.next == null; } }
public void MakeEmpty()
{
m_Head.next = m_Head;
m_Count = 0;
}
private RListNode<T> Find(T item, out int index)
{
RListNode<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 RListNode<T> FindPrevious(T item)
{
RListNode<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)
{
RListNode<T> current = new RListNode<T>(item);
m_End.next = current;
current.next = m_Head;
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!");
RListNode<T> current = this.m_Head;
RListNode<T> node = new RListNode<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)
{
RListNode<T> p = FindPrevious(item);
if (p.next != null)
{
p.next = p.next.next;
m_Count--;
}
}
public void PrintList()
{
RListNode<T> current = m_Head;
while (current.next != m_Head)
{
Console.WriteLine(current.next.value);
current = current.next;
}
}
public T Move(int step)
{
RListNode<T> current = m_Head;
RListNode<T> temp;
while (step-- > 0)
{
if (current.next == m_Head)
current = current.next;
current = current.next;
}
temp = current;
return temp.value;
}
public void Print(int step)
{
RListNode<T> current = this.m_Head;
while (step-- > 0)
{
if (current.next == m_Head)
current = current.next;
Console.WriteLine(current.next.value);
current = current.next;
}
}
}
}
作 者:doku
出 处:http://www.cnblogs.com/kulong995/
关于作者:喜欢编程,喜欢美食,专注于.NET项目开发。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!


浙公网安备 33010602011771号