链表

55链表中环的入口结点

☆樱花仙子☆ 提交于 2020-03-28 00:02:53
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one. Example 1: Input: [1,3,4,2,2] Output: 2 Example 2: Input: [3,1,3,4,2] Output: 3 Note: You must not modify the array (assume the array is read only). You must use only constant, O (1) extra space. Your runtime complexity should be less than O ( n 2). There is only one duplicate number in the array, but it could be repeated more than once. 题目设定的问题是N+1个元素都在[1,n]这个范围内

ConcurrentHashMap --- 第一 cas 操作数组元素

这一生的挚爱 提交于 2020-03-27 15:51:31
首先贴 java 8 中实现的源代码 1 /** Implementation for put and putIfAbsent */ 2 final V putVal(K key, V value, boolean onlyIfAbsent) { 3 if (key == null || value == null) throw new NullPointerException(); 4 int hash = spread(key.hashCode()); 5 int binCount = 0; 6 for (Node<K,V>[] tab = table;;) { 7 Node<K,V> f; int n, i, fh; 8 if (tab == null || (n = tab.length) == 0) // 第一次使用时,整个 table 为 null 9 tab = initTable(); 10 else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) { 11 if (casTabAt(tab, i, null, 12 new Node<K,V>(hash, key, value, null))) 13 break; // no lock when adding to empty bin 14 } 15 else

Java中的阻塞队列LinkedBlockingQueue

匆匆过客 提交于 2020-03-27 13:27:54
目录 1.LinkedBlockingQueue介绍 1.1BlockingQueue接口 1.2LinkedBlockingQueue 1.3LinkedBlockingQueue原理与数据结构 2.LinkedBlockingQueue源码分析 2.1创建 2.2put方法 2.3take方法 1.LinkedBlockingQueue介绍 1.1BlockingQueue接口 同ArrayBlockingQueue一样,LinkedBlockingQueue同样实现了BlockingQueue接口。 1.2LinkedBlockingQueue LinkedBlockingQueue LinkedBlockingQueue是一个单向链表实现的阻塞队列。 LinkedBlockingQueue可以在创建时指定容量大小,防止队列过度膨胀。如果未指定队列容量,默认容量大小为Integer.MAX_VALUE。 1.3LinkedBlockingQueue原理与数据结构 说明: (01) head是链表的表头。取出数据时,都是从表头head处取出,出队。 (02) last是链表的表尾。新增数据时,都是从表尾last处插入,入队。 (03) count是链表的实际大小,即当前链表中包含的节点个数。 (04) capacity是列表的容量,它是在创建链表时指定的。 (05)

HashMap的工作原理【文字版】

混江龙づ霸主 提交于 2020-03-27 12:12:53
3 月,跳不动了?>>> HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道 Hashtable和HashMap之间的区别 ,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题,甚至会要求你实现HashMap来考察你的编程能力。ConcurrentHashMap和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的旅程吧! 先来些简单的问题 “你用过HashMap吗?” “什么是HashMap?你为什么用到它?” 几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable则不能;HashMap是非synchronized;HashMap很快;以及HashMap储存的是键值对等等。这显示出你已经用过HashMap,而且对它相当的熟悉。但是面试官来个急转直下,从此刻开始问出一些刁钻的问题,关于HashMap的更多基础的细节。面试官可能会问出下面的问题: “你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?” 你也许会回答“我没有详查标准的Java API,你可以看看Java源代码或者Open JDK。”

C++ 单链表的冒泡排序

爱⌒轻易说出口 提交于 2020-03-27 05:08:00
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> struct Node { int id; Node* next; }; //初始化头节点 Node* init_m_head() { Node* temp = (Node*)malloc(sizeof(Node)); temp->id = 0; temp->next = NULL; return temp; } //初始化子节点 Node* init_Node(int num) { Node* temp= (Node*)malloc(sizeof(Node)); temp->id = num; temp->next = NULL; return temp; } //节点链接 void nodelink(Node* n1, Node* n2) { n2->next = n1->next; n1->next = n2; } //节点交换 void swap(Node* n1, Node* n2) { Node* temp = n1; n1 = n2; n2 = temp; } //void maopao(Node* list) // { // Node* temp = list->next; // Node* pre = list; //

Java Map

拥有回忆 提交于 2020-03-26 18:55:30
Map无论在Java编程或者面试中,都占用很重要的地位,这里试图聊聊相关的概念,看看是否能够理清楚相关的思路。 HashMap HashMap 是我们经常会用到的集合类,JDK 1.7 之前底层使用了数组加链表的组合结构,如下图所示: 新添加的元素通过取模的方式,定位 Table 数组位置,然后将元素加入链表头部,这样下次提取时就可以快速被访问到。 访问数据时,也是通过取模的方式,定位数组中的位置,然后再遍历链表,依次比较,获取相应的元素。 如果 HasMap 中元素过多时,可能导致某个位置上链表很长。原本 O(1) 查找性能,可能就退化成 O(N) ,严重降低查找效率。 为了避免这种情况,当 HasMap 元素数量满足以下条件时,将会自动扩容,重新分配元素。 1// size:HashMap 中实际元素数量 2//capacity:HashMap 容量,即 Table 数组长度,默认为:16 3//loadFactor:负载因子,默认为:0.75 4 size>=capacity*loadFactor HasMap 将会把容量扩充为原来的两倍,然后将原数组元素迁移至新数组。 1void transfer(Entry[] newTable, boolean rehash) { 2 int newCapacity = newTable.length; 3 for (Entry<K,V

ConcurrentHashMap(1.8) 相关整理

天涯浪子 提交于 2020-03-26 15:03:22
1. ConcurrentHashMap 1.1 HaspMap(JDK 1.8) JDK 1.8 HashMap JDK 1.8 对 HashMap 进行了修改, 最大的不同就是利用了红黑树,其由数组+链表+红黑树组成 。 JDK 1.7 中,查找元素时,根据 hash 值能够快速定位到数组的具体下标,但之后需要顺着链表依次比较才能查找到需要的元素,时间复杂度取决于链表的长度,为 O(N) 。 为了降低这部分的开销,在 JDK 1.8 中,当链表中的元素超过 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN) 。 JDK 1.8 使用 Node(1.7 为 Entry) 作为链表的数据结点,仍然包含 key,value,hash 和 next 四个属性。 红黑树的情况使用的是 TreeNode。 根据数组元素中,第一个结点数据类型是 Node 还是 TreeNode 可以判断该位置下是链表还是红黑树。 核心成员变量于 1.7 类似,增加了核心变量,如下表。 属性 说明 TREEIFY_THRESHOLD 用于判断是否需要将链表转换为红黑树的阈值,默认为 8。 put 方法过程 public V put(K key, V value) { return putVal(hash(key), key, value, false, true);

剑指Offer(链表)-反转链表

独自空忆成欢 提交于 2020-03-26 09:52:26
  (反转链表) 题目描述: 输入一个链表,反转链表后,输出新链表的表头。    解题思路: 题给的链表是一个单向链表,所以为了反转整个链表,需要将节点之间的指向问题进行整理,最后一个结点指向倒数第二个,倒数第二个指向倒数第三个,......,第二个指向第一个,第一个指向null;这就需要把结点挨个从链表上摘下来,做调整;这个调整过程需要两个指针辅助:pre记录其前一个结点位置,好让该结点的next指针指向前一个结点,但是在指向前一个结点前需要用一个指针p记录后一个结点地址, 避免结点丢失 。 以head结点为例步骤如下: 1.反转后head是指向null,所以未反转的时候其前一个结点应该是null,初始化pre指针为null; 2.用p指针记录head的下一个结点head.next; 3.从链表上摘下head,即让head.next指向pre; 4.此时已完成head结点的摘取及与前一个节点的连接,则我们需要操作下一个结点:故需移动pre和head,让pre指向head,head指向下一个节点。 重复这四个操作直到head走完原链表,指向null时,循环结束,返回pre。 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/

两个链表存储的数进行相加问题

十年热恋 提交于 2020-03-26 04:21:54
本文章分成几个部分: 问题,代码,测试 问题 :请用代码实现,两个链表,分别存储一个数字的各个位数,请计算两个链表的相加结果。 如: l1: 1->3->4 l2: 8->9 输出结果为: 223 代码 : #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include "my_list.h" #define max(a,b) (((a) > (b)) ? (a) : (b)) struct ListNode* reverse_list(struct ListNode* head) { if (head == NULL || head->next == NULL) return head; struct ListNode *pre = head; struct ListNode *cur = head->next; struct ListNode *tmp = head->next->next; while(cur) { tmp = cur->next; cur->next = pre; pre = cur; cur = tmp; } head->next = NULL; return pre; } void add_list_node(struct ListNode

day03 【List、Set、数据结构、Collections】

。_饼干妹妹 提交于 2020-03-26 01:56:35
day03 【List、Set、数据结构、Collections】 主要内容 数据结构 List集合 Set集合 Collections 教学目标 [ ] 能够说出List集合特点 [ ] 能够说出常见的数据结构 [ ] 能够说出数组结构特点 [ ] 能够说出栈结构特点 [ ] 能够说出队列结构特点 [ ] 能够说出单向链表结构特点 [ ] 能够说出Set集合的特点 [ ] 能够说出哈希表的特点 [ ] 使用HashSet集合存储自定义元素 [ ] 能够说出可变参数的格式 [ ] 能够使用集合工具类 [ ] 能够使用Comparator比较器进行排序 第一章 数据结构 2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。 现实世界的存储,我们使用的工具和建模。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。 我们java是面向对象的语言,就好似自动档轿车,C语言好似手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A点 开到 B点