C# 数据结构 - 单链表 双链表 环形链表
2015-07-08 15:15
513 查看
链表特点(单链表 双链表)
优点:插入和删除非常快。因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作。
缺点:当需要查找某一个节点的时候就需要一个节点一个节点去访问,这样所花的时候就比较多了。(顺序表可以弥补这缺点,但插入和删除就非常耗性能)
单链表
单链表的构成:必须要有一个链表头(head),每个节点里面有一个Next用于指向下一个节点(类似于指针)。最后一个节点的Next为null来标识链表的尾。
如下图
View Code
总结:
1.扩展训练题其实考的就是环形链表,这个题目跟约瑟夫问题是一样的(实现思路是一样的)
2.“程序=算法+数据结构”,但是在我们真正开发的时候算法和数据结构用到很少,一般比较大型项目或者复杂度比较高项目和游戏里面可能才会用到这些,但是我们还是要了解,说不定面试考到了呢?(答对了会加分的哦!^_^)
3.链表什么时候会用到呢?比如说象棋里面有悔棋,我们就可以用双向链表来实现,这样就可以悔到上一步也可以下一步了,还有很多应用场景。而单链表的话像LinkedList就是用单链表实现的(但是LinkedList被List代替,不推荐用LinkedList,推荐用List.自己查一下为什么?)
(本人学识有限,文章如有误,愿见谅。希望能指出来,以免误人子弟了。^_^)
优点:插入和删除非常快。因为单链表只需要修改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.自己查一下为什么?)
(本人学识有限,文章如有误,愿见谅。希望能指出来,以免误人子弟了。^_^)
相关文章推荐
- 【LeetCode 232_数据结构_队列_实现】Implement Queue using Stacks
- python数据结构之图的实现方法
- python数据结构之图深度优先和广度优先实例详解
- 【LeetCode 225_数据结构_栈_实现】Implement Stack using Queues
- 数据结构与算法—循环链表
- 数据结构与算法—单链表
- Android JNI 使用的数据结构JNINativeMethod详解
- java数据结构和算法------线性表(顺序表结构)
- python数据结构之图深度优先和广度优先实例详解
- python数据结构之图的实现方法
- java数据结构和算法------二叉排序树
- STL模板类--数据结构与算法
- 【C++ STL】算法 <algorithm>中各种算法解析 分类: C/C++ 数据结构与算法 2015-07-07 21:37 22人阅读 评论(0) 收藏
- Java数据结构与算法-数组
- 2015湖南省队集训DAY4——hoodle
- 【字符串数据结构后缀系列Part2】后缀自动机学习笔记
- 2015湖南省队集训DAY3——Light
- COJ 0995 WZJ的数据结构(负五)区间操作
- COJ 1010 WZJ的数据结构(十) 线段树区间操作
- [数据结构]线性结构——栈