当前位置:编程学习 > C#/ASP.NET >>

数据结构C#——循环链表

我曾经去一家游戏公司面试时遇到一个笔试题,大意就是说有一群人出去旅游,在河中遇到了大风,然后用转盘决定谁在留在船上,谁自己跳下去自行解决生存问题。大家围成一个圈,启动转盘,转盘指向谁就从睡开始数数,当有人数到13时,谁就跳下去,然后从下一个人开始从头数,当再有人数到13时,继续上一个循环。

 当时题意没看太明白,我直接用了一个单向链表解决那个事情,结果最后运行的结果总是剩下最开始的两口人,最后在跟面试官谈的时候才猛然想起围成一个圈其实就应该用循环链表来解决这个问题。

 下面看看循环链表的示意图:

 循环链表示意图


循环链表与单项链表唯一的区别就是单向链表尾部不指向任何元素,而循环链表的尾部指向链表的头部,示例代码如下:
using System; 
using System.Collections.Generic; 
using System.Text; 
namespace DataStructure 

    /// <summary>  
    /// 循环链表  
    /// </summary>  
    /// <typeparam name="T"></typeparam>  
    public class LoopLink<T> : IListDS<T> 
    { 
        /// <summary>  
        /// 链表头属性  
        /// </summary>  
        private LoopLinkNode<T> head; 
        public LoopLinkNode<T> Head 
        { 
            set 
            { 
                head = value; 
                head.Next = head; 
            } 
            get { return head; } 
        } 
        /// <summary>  
        /// 构造函数,构造空链表  
        /// </summary>  
        public LoopLink() 
        { 
            this.head = null; 
        } 
        /// <summary>  
        /// 构造函数  
        /// </summary>  
        /// <param name="head"></param>  
        public LoopLink(LoopLinkNode<T> head) 
        { 
            this.head = head; 
            this.head.Next = this.head; 
        } 
        /// <summary>  
        /// 实现索引器  
        /// </summary>  
        /// <param name="index"></param>  
        /// <returns></returns>  
        public LoopLinkNode<T> this[int index] 
        { 
            set 
            { 
                if (IsEmpty()) 
                    throw new Exception("链表为空"); 
                if (index < 0 || index > this.GetLength() - 1) 
                    throw new Exception("索引超出链表长度"); 
                LoopLinkNode<T> node = head; 
                for (int i = 0; i < index; i++) 
                { 
                    node = node.Next; 
                } 
                node.Data = value.Data; 
                node.Next = value.Next; 
            } 
            get 
            { 
                if (IsEmpty()) 
                    throw new Exception("链表为空"); 
                if (index < 0 || index > this.GetLength() - 1) 
                    throw new Exception("索引超出链表长度"); 
                LoopLinkNode<T> node = head; 
                for (int i = 0; i < index; i++) 
                { 
                    node = node.Next; 
                } 
                return node; 
            } 
        } 
        /// <summary>  
        /// 获取链表长度  
        /// </summary>  
  

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,