链表

18 循环链表

烂漫一生 提交于 2020-03-17 02:15:12
1,循环链表的初始化 定义一个头结点和尾指针的方式,头结点在这里是用来连接 第一个结点和最后一个结点的结点 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct Link { 5 int data; 6 struct node* next; 7 }link; 8 9 link* head_node; //声明一个头结点 10 link* ptail; //声明一个尾指针 11 12 link* initLink() //初始化循环链表 13 { 14 link* new_node; 15 head_node = (link*)malloc(sizeof(link)); 16 ptail = head_node; //尾指针指向头结点 17 18 //初始化创建10个结点的循环链表 19 for (int i = 0; i < 10; i++) 20 { 21 link* new_node = (link*)malloc(sizeof(link)); 22 ptail->next = new_node;//把新节点接到链表上去,相当于head_node->next = new_node,但这里不能使用head_node->next,而是使用ptail->next,因为头结点不能动 23 24 new_node-

Task12_141_环形链表

丶灬走出姿态 提交于 2020-03-17 02:06:27
题目 给定一个链表,判断链表中是否有环。 思路 两个指针,一个每次移动一步,另一个每次移动两步,若有环形,则最终会相遇,若没有,则终会为空。 public bool HasCycle1 ( ListNode head ) { ListNode temp1 = head ; ListNode temp2 = head ; while ( temp1 != null && temp2 != null ) { if ( temp2 . next != null ) { temp1 = temp1 . next ; temp2 = temp2 . next . next ; } else return false ; if ( temp1 == temp2 ) return true ; } return false ; } 来源: CSDN 作者: weixin_961876584 链接: https://blog.csdn.net/weixin_45775970/article/details/104826263

Java 集合

你。 提交于 2020-03-17 01:16:34
1、说说List,Set,Map三者的区别? List:有序、元素可重复 Set:元素不能重复 Map: 一个元素即一个键值对,key唯一标识一个键值对,key不能重复,元素可以重复,key、value均可以是任意类型。 2、Arraylist 与 LinkedList 区别? 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是都不保证线程安全; 2. 底层数据结构: Arraylist 底层使用数组; LinkedList 底层使用双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!) 3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② LinkedList 采用链表存储,所以对于 add(E e) 方法的插入

关于HashMap的一些知识点整理

只愿长相守 提交于 2020-03-17 01:11:17
本文来自网上各个知识点的整理 HashMap采用Entry数组(Java8叫Node)来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,以此来解决Hash冲突的问题。 但链表的查询复杂度大,一但链表过长,查询的效率下降。 在Jdk1.8中HashMap的实现方式做了一些改变,数据结构的存储由数组+链表的方式,变化为数组+链表+红黑树的存储方式,当链表长度超过阈值(8)时,将链表转换为红黑树。在性能上进一步得到提升。但每次插入新的数据,都得维护红黑树的结构,复杂度为O(logn)。 链表:插入复杂度O(1),查找复杂度O(n) 红黑树:插入复杂度O(logn),查找复杂度O(logn) 但既然红黑树这么棒,那为什么HashMap为什么不直接就用红黑树呢? 因为树节点所占空间是普通节点的两倍,所以只有当节点足够多的时候,才会使用树节点。也就是说,节点少的时候,尽管时间复杂度上,红黑树比链表好一点,但是红黑树所占空间比较大,综合考虑,认为只能在节点太多的时候,红黑树占空间大这一劣势不太明显的时候,才会舍弃链表,使用红黑树。 那为什么链表长度为8时才会选择使用红黑树呢? 为了配合使用分布良好的HashCode,树节点很少使用。并且在理想状态下,受随机分布的HashCode影响

MongoDB for C#基础入门

心已入冬 提交于 2020-03-17 01:02:56
笔者这里采用的是mongoDB官网推荐使用.net驱动: http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/ 有关于MongoDB的安装读者可以参考其他的博客,对于基本的学习来说并不需要进行过多的配置。 创建连接 这一步骤跟ADO.NET连接到数据库的步骤是一样的,ADO.NET是利用SqlConnection连接数据库,而MongoDB则使用MongoClient连接,并在构造函数中将连接字符传递进去,当然可以不传递,那么默认就是连接本地的计算机的默认端口(27017),比如下面的三种连接方式: 1 var client = new MongoClient(); 2 3 var client1 = new MongoClient("mongodb://localhost:27017"); 4 5 var client2 = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019"); 获取数据库 为了获取数据库,只需要调用 MongoClient 对象的 GetDatabase 方法,并传入数据库名称即可,如果数据库存在则直接返回,否则就创建该数据库并返回,比如下面的这段代码将创建名为

数组和链表区别

我是研究僧i 提交于 2020-03-17 01:01:41
总结: 1) 数组 便于 查询和修改 ( 顺序线性 ),但是不方便新增和删除 2) 链表 适合 新增和删除 ( 指针 ),但是不适合查询,根据业务情况使用合适的数据结构和算法是在大数据量和高并发时必须要考虑的问题 1.链表是什么 链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过 指针来连接 元素与元素; 链表是 线性表 的一种,所谓的线性表包含顺序线性表和链表, 顺序线性表是用 数组 实现的 ,在内存中有顺序排列,通过改变数组大小实现。 而 链表 不是用顺序实现的,用指针实现, 在内存中不连续 。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。 所以, 链表允许插入和删除表上任意位置上的节点 ,但是不允许随即存取。 链表有很多种不同的类型:单向链表、双向链表及循环链表。 2.单向链表 单向链表包含两个域,一个是 信息域 ,一个是 指针域 。也就是单向链表的节点被分成两部分,一部分是保存或显示关于节点的信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值。 3.双向链表 从上图可以很清晰的看出,每个节点有2个链接,一个是指向前一个节点(当此链接为第一个链接时,指向的是空值或空列表),另一个则指向后一个节点(当此链接为最后一个链接时,指向的是空值或空列表)。 意思就是说 双向链表有2个指针

双向链表大型攻略

两盒软妹~` 提交于 2020-03-16 20:35:32
我们之前已经做了链表的大型攻略。包括如何创建一个链表,插入节点,打印数据,删除节点等常用的功能。我们通常将这种每个节点有一个数据段和一个指向下个节点指针的链表为 单向链表 。我想通过某一个节点能找到下一个节点,但是如果我想通过该节点找到上一个节点呢?这几乎是不可能的。除非我将单向链表首尾相连构成环形的单向循环链表,走一个循环之后就可以找到其上一个节点的数据了,但是这有过于麻烦,为了解决这种问题,我们引入了 双向链表 ,也就是说在一个节点上不仅有指向下一个节点的指针,还有另外一个指针指向上一个节点。 没错,每一个节点就长这个样子,有两个指针,当然了我们给他们不容的名字,并将他们分别指向上一个和下一个节点: 当然了也需要有一个头指针和头节点 其实双向链表和单向链表的区别仅仅就是每个节点多了一个指向上个节点的指针,所以我们在操作时要多做一个指向的步骤。 我们首先 创建一个节点 ,要记得是2个指针 typedef struct Node { int data; struct Node *prev; struct Node *next; }node; 用刚才的结构体写一个函数, 新建节点 ,和之前的单向链表别无二致 /************************* *函数功能:新建节点 *输入参数:节点所存数据 *返 回 值:节点指针 **************************

手撕代码-反转链表

你。 提交于 2020-03-16 19:56:42
反转链表 node * func(node*phead) { node* cur_next; node* cur_previous = NULL; node* current = phead; while(current != NULL) { cur_next = current->pnext; current->pnext = cur_previous; cur_previous = current; current = cur_next; } return cur_previous; } 参考:https://blog.csdn.net/Li_haiyu/article/details/88668383 来源: CSDN 作者: 进击的黑子 链接: https://blog.csdn.net/qq_37266079/article/details/104900686

哈希表结构 笔记

ⅰ亾dé卋堺 提交于 2020-03-16 19:50:33
Hash-Table (空间换时间) 利用哈希函数生成对应的index(o(1); 利用生成的index(O(1)) 来操作指定位置的元素 O(1) 时间复杂度 Hash 冲突: 两个不同的key ,经过哈希函数计算出相同的结果解决办法: 1) 开放定址法:按照一定规则向其他地址探测,直到遇到空桶 2) 再Hash法 :利用另一个Hash函数再次计算,看是否与第一个相 3) 链地址法:通过链表将同一index的元素串起来 JDK 1.8 解决Hash冲突: 默认单向链表将元素串起来 在添加元素时有可能将单向链表转为红黑树(当哈希表容量大于64 或者链表节点数大于8) 当红黑树的节点少于一定数量后,也会转成单向链表 表为什么使用单链表? 1.挨个比较key 相同就覆盖掉 不同就尾插 2. 每次从头开始比较 3. 节省空间 比双链表少一个指针 Hash 函数: 先生成key 的哈希值 再让key 的哈希值与数组的大小进行相关的计算 生成索引值(Hash(key)要小于数组) Hash(key)%table.length 为了提高效率 ,可以将 % 更换为 & (前提是将数组的长度设计为2En) Hash(key)&(table.length-1) ——》 按照此方法得出的数字必然小于table.length (2En -1 保证数字全部是1) 良好的哈希函数: 算出的索引分布比较均匀

Map集合面试题

自闭症网瘾萝莉.ら 提交于 2020-03-16 18:30:51
有可能问道你都知道哪些常用的Map集合?   HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。 Collection集合接口和Map接口有什么关系?   没关系,Collection是List、Set父接口不是Map父接口。 HashMap是线程安全的吗?线程安全的Map都有哪些?性能最好的是哪个?   HashMap不是线程安全的。线程安全的有HashTable、ConcurrentHashMap、SynchronizedMap,性能最好的是ConcurrentHashMap。 使用HashMap有什么性能问题吗?   使用HashMap要注意避免集合的扩容,它会很耗性能,根据元素的数量给它一个初始大小的值。 HashMap的数据结构是怎样的?默认大小是多少?内部是怎么扩容的?   HashMap是数组和链表组成的,默认大小为16,当hashmap中的元素个数超过数组大小*loadFactor(默认值为0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。 怎么按添加顺序存储元素?怎么按A-Z自然顺序存储元素?怎么自定义排序?   按添加顺序使用LinkedHashMap,按自然顺序使用TreeMap,自定义排序TreeMap(Comparetor c)。