您的位置:首页 > 理论基础 > 数据结构算法

C# 数据结构 - 单链表 双链表 环形链表

2015-07-08 15:15 513 查看
链表特点(单链表 双链表)

优点:插入和删除非常快。因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作。

缺点:当需要查找某一个节点的时候就需要一个节点一个节点去访问,这样所花的时候就比较多了。(顺序表可以弥补这缺点,但插入和删除就非常耗性能)

单链表

单链表的构成:必须要有一个链表头(head),每个节点里面有一个Next用于指向下一个节点(类似于指针)。最后一个节点的Next为null来标识链表的尾。

如下图

//N个人
int n = 5;

//第K个人开始数数
int k = 3;

//数到M就退出
int m = 4;

Game head = new Game();

//构建一个由N个人组成的圆形
Game.Add(ref head, n);
//查找谁会被炸死
Game.Bomb(ref head, k, m);

/// <summary>
/// 游戏类
/// </summary>
public class Game
{
public int No { get; set; }

public Game Next { get; set; }

public Game() { }

public Game(int no)
{
this.No = no;
}

public static void Add(ref Game head, int n)
{
Game cursor = null;
for (int i = 0; i < n; i++)
{
Game temp = new Game(i+1);
if (i == 0)
{
head.Next = temp;
head = temp;
cursor = head;
}
else
{
cursor.Next = temp;
temp.Next = head;
cursor = cursor.Next;
}
}
}

/// <summary>
/// 查找谁会被炸死
/// </summary>
/// <param name="head">链表头</param>
/// <param name="k">开始数数的人</param>
/// <param name="m">数几就退出圆圈</param>
public static void Bomb(ref Game head,int k, int m)
{
Game tail = head;

//拿到最后一个节点
while (!Object.ReferenceEquals(tail.Next,head))
{
tail = tail.Next;
}

//从第K个人开始数数
for (int i = 0; i < k; i++)
{
head = head.Next;
tail = tail.Next;
}

//当头跟尾是同一个节点说明找到最终的节点
int mark = 1;
while (!object.ReferenceEquals(tail,head))
{
for (int i = 0; i < m-1; i++)
{
head = head.Next;
tail = tail.Next;
}

Console.WriteLine(@"第"+mark+@"个安全退出人的编号:"+head.No);

head = head.Next;
tail.Next = head;
mark++;
}

Console.WriteLine(@"最后被炸死人的编号:" + head.No);
}
}


View Code

  总结:

    1.扩展训练题其实考的就是环形链表,这个题目跟约瑟夫问题是一样的(实现思路是一样的)

    2.“程序=算法+数据结构”,但是在我们真正开发的时候算法和数据结构用到很少,一般比较大型项目或者复杂度比较高项目和游戏里面可能才会用到这些,但是我们还是要了解,说不定面试考到了呢?(答对了会加分的哦!^_^)

    3.链表什么时候会用到呢?比如说象棋里面有悔棋,我们就可以用双向链表来实现,这样就可以悔到上一步也可以下一步了,还有很多应用场景。而单链表的话像LinkedList就是用单链表实现的(但是LinkedList被List代替,不推荐用LinkedList,推荐用List.自己查一下为什么?)

  

  (本人学识有限,文章如有误,愿见谅。希望能指出来,以免误人子弟了。^_^)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: