首页 / 软件开发 / C# / 数据结构(C#):循环链表
数据结构(C#):循环链表2011-08-16 博客园 飘遥(Zhenxing Zhou)循环链表可以是单链表,也可以是双链表。链表的尾节点的后继节点指向头结点便成了循环链表。我们在这里继承双链表实现循环链表,当到达双链表的表尾时,让游标指向第0个节点;当到达双链表 的开头时,让游标指向结尾节点,这样就实现了循环双链表。结尾用一个经典的约瑟夫问题来作循环链表 的应用示例。1.循环链表代码:/*
* File : CircularlyLinkedList.cs
* Author : Zhenxing Zhou
* Date : 2008-12-07
* Blog : http://www.xianfen.net/
*/
using System;
namespace Xianfen.Net.DataStructure
{
public class CircularlyLinkedList<T> : DoubleLinkedList<T>
{
private DoubleLinkedListNode<T> m_CurrentNode;
private int m_CurrentIndex;
public int CurrentIndex
{
get { return m_CurrentIndex; }
}
public CircularlyLinkedList()
: base()
{
m_CurrentNode = m_Head.Next;
m_CurrentIndex = 0;
}
public CircularlyLinkedList(T t)
: base(t)
{
m_CurrentNode = m_Head.Next;
m_CurrentIndex = 0;
}
public T GetCurrent()
{
if (m_Count == 0)
{
throw new IndexOutOfRangeException();
}
return m_CurrentNode.Value;
}
public T GetNext()
{
if (m_Count == 0)
{
throw new IndexOutOfRangeException();
}
if (m_CurrentNode != null)
{
m_CurrentNode = m_CurrentNode.Next;
m_CurrentIndex++;
}
if (m_CurrentNode == null)
{
m_CurrentNode = m_Head.Next;
m_CurrentIndex = 0;
}
return m_CurrentNode.Value;
}
public T GetPrevious()
{
if (m_Count == 0)
{
throw new IndexOutOfRangeException();
}
if (m_CurrentNode != null)
{
m_CurrentNode = m_CurrentNode.Prior;
m_CurrentIndex--;
}
if (m_CurrentNode == null || m_CurrentNode == m_Head)
{
m_CurrentNode = m_Tail;
m_CurrentIndex = m_Count - 1;
}
return m_CurrentNode.Value;
}
}
}