链表

集合框架之HashMap(一)

半城伤御伤魂 提交于 2020-03-01 08:33:16
HashMap是非常重要的数据结构,并且大部分面试都会问到,优秀的java程序员应当要对HashMap进行深入的了解,今天我们就来剖析一下它。 目录 HashMap简介 成员变量 get和put的流程 hashMap相关的面试题 总结 一.简介 首先,HashMap是一个无序key,value集合,它的底层存储是由数组加链表和红黑树结构组成的的。在进行添加,删除和查找时,效率非常高,如果不考虑哈希碰撞,一次定位就能完成操作,时间复杂度为O(1)。 下面是一个默认长度的hashMap。 二.hashMap的成员变量 1.初始大小 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 这个是值是数组长度,也就是数组的初始最大行数,当然如果碰撞比较多,也有可能hashMap存了200个值,但是容量还是16。当然这不是理想状态。 2.最大值 static final int MAXIMUM_CAPACITY = 1 << 30; 这个没有什么好说的,hashMap最大容量。 3.增长因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; 增长因子,就是如果数组被占用的大小超过当前大小的75%时,就进行扩容,按照当前容量二倍创建一个新的Entry

数据结构与算法单排日记-2020/2/29-数据结构综述

有些话、适合烂在心里 提交于 2020-03-01 06:55:44
1.栈——先进先出 入口出口在集合的一侧 2.队列——先进先出 入口和出口在集合的一侧 3.数组:查询快,增删慢 查询快 :数组的地址是 连续 的,通过数组的首地址找到数组,通过数组的索引可以快速查找某个元素 增删慢 :数组长度固定,想要增加/删除一个元素,必须创建一个新数组,把源数组复制过来 3.链表:查询慢,增删快 查询慢 :链表的地址是 不连续 的,每次查询元素都要从头开始 增删快 :链表结构,增加/删除一个元素,对链表的整体结构没有影响 链表中每一个元素成为节点,1个节点=1个数据源(存储数据)+2个指针域(存储地址) 类型 单向链表:只有一条链子,不能保证存储和取出的顺序一致 双向链表:两条链子,有一条链子专门记录元素的顺序 增删 5.红黑树:查询速度非常快 来源: CSDN 作者: Mango学习日记 链接: https://blog.csdn.net/wangzilong1995/article/details/104575824

剑指offerNo55. 链表中环的入口结点(Java)

僤鯓⒐⒋嵵緔 提交于 2020-03-01 05:55:29
题目描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路: 思路1:设 置快慢指针,刚开始快慢指针同时指向某一个节点,然后进行next,当快慢指针再次相遇的时候,说明该链表有环。 思路2:使用HashSet存储节点,遍历将节点加入hashSet,如果存在环,那么入口节点就是那个在HashSet里第一个重复的节点。下面是思路2的代码。(思路1的代码leetcode刷题列表里有) 代码: package offer01; import java.util.HashMap; import java.util.HashSet; public class TestNo55 { static class ListNode{ int val; ListNode next; ListNode(int val){ this.val = val; } } public static void main(String[] args) { ListNode node = new ListNode(0); ListNode node1 = new ListNode(1); ListNode node2 = new ListNode(3); ListNode node3 = new ListNode(4); node.next = node1; node1.next =

【力扣】141. 环形链表

匆匆过客 提交于 2020-03-01 05:51:36
一、题目描述: 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [ 3,2,0,-4 ] , pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [ 1,2 ] , pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [ 1 ] , pos = -1 输出:false 解释:链表中没有环。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 二、题目分析: 使用快慢指针,slow一次走一步,fast一次走两步,slow和fast重合则表示有环。 三、代码描述: /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */

数据结构-线性表-单链表

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-01 03:58:32
不带头结点的 单链表 (链式存储) 不要求逻辑上相邻的两个数据元素逻辑上也相邻,他们是通过"链",建立起数据元素之间的逻辑关系。因此对线性表的插入、删除 不需要移动数据元素,只需要修改"链" 。 例如:画出26个字母的链式存储结构 逻辑结构:(a,b,c,…,x,y,z) 链式存储结构: 结点由两个域组成: 数据域 :存储元素数值数据 指针域 :存储直接后继结点的存储位置 与链式存储有关的术语 结点:数据元素的存储映像。由数值域和指针域两部分组成。 链表:n个结点由链指针组成一个链表。他是线性表的链式存储映像,称为线性表的链式存储结构。 单链表:结点只有一个指针域的链表。 双链表:有两个指针域的链表。 循环链表:首尾相接的链表。 头指针、首元结点 头指针:指向链表中第一个结点的指针。 首元结点:链表中存储第一个数据元素a1的结点。 空表 非空表 单链表是由表头唯一确定,因此单链表可以用头指针的名字来命名。若头指针是head,则把链表称之为表head。 建立一个空的单链表 : node * init ( ) { return NULL ; } 遍历操作 工作指针后移,从首结点出发,通过工作指针的反复后移而将整个单链表"审视"一次的方法。 输出单链表中各个结点的值 void display ( linklist head ) { linklist p ; p = head ; if (

2-13链表每k个节点之间逆序

空扰寡人 提交于 2020-03-01 03:27:57
题目描述 链表每k个节点之间逆序,最后不足k个的节点不用逆序。 解题方法1 最简便的方式可以使用栈来完成,将链表节点依次入栈,当栈中元素达到k个时再依次出栈尾插到新链表中,这样不断入栈k个元素出栈k个元素就可以实现每k个节点之间逆序。 需要注意的是,如果链表长度不是k的倍数,会有最后一组节点不足k个。如果循环结束栈中还有元素就将这些元素按原链表顺序插入到新链表之后(头插)。 public class Test { public static void main ( String [ ] args ) throws Exception { int [ ] arr = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 } ; Node head = create1 ( arr ) ; fun ( head , 3 ) ; for ( Node p = head . next ; p != null ; p = p . next ) { System . out . println ( p . val ) ; } } //将单链表每k个节点逆序 public static void fun ( Node head , int k ) { Stack < Node > s = new Stack < > ( ) ; Node p =

237.删除链表中的节点

风流意气都作罢 提交于 2020-03-01 03:24:26
这道题主要就是在,给出的点就是要删除的点。 只需要将链表后续的值往前挪一位,再将最后一位置NULL就ok /** Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; / class Solution { public: void deleteNode(ListNode node) { ListNode* p=node; while(p->next->next!=NULL) { node->val=p->next->val; node=node->next; p=p->next; } node->val=p->next->val; node->next=NULL; } }; 来源: CSDN 作者: qq_40742888 链接: https://blog.csdn.net/qq_40742888/article/details/104578822

LinkedList 源码深度解析

十年热恋 提交于 2020-03-01 03:15:21
LinkedList 源码深度解析 一、重新认识LinkedList 什么是LinkedList? LinkedList是基于 双向链表 实现的List类,与ArrayList基于数组的实现方式不同。链表数据结构的特点是每个元素分配的 空间不必连续 、插入和删除元素时速度非常快、但访问元素的速度较慢,适用于集合元素先入先出和先入后出的场景。 长啥样? 如图是一个4节点的双向链表结构的LinkedList,双向链表里的每个节点称为Node,Node在java里的实现如下: private static class Node < E > { E item ; // 节点值 Node < E > next ; // 指向的后一个节点 Node < E > prev ; // 指向的前一个节点 // 初始化参数顺序分别是:前一个节点、本身节点值、后一个节点 Node ( Node < E > prev , E element , Node < E > next ) { this . item = element ; this . next = next ; this . prev = prev ; } } 双向链表有哪些基本概念? 双向链表里,每个节点有三个字段,item为本节点的值,prev指向前一个节点,next指向后一个节点; 双向链表的最前面的一个节点也称为头节点

面试题 25:合并两个排序的链表

◇◆丶佛笑我妖孽 提交于 2020-03-01 00:13:09
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路 声明一个虚拟头节点 然后开始遍历两个链表 如果 第一个链表的头节点值小于第二个链表的头节点值,那么就让虚拟头节点指向第一个链表的头节点; 反之指向第二个链表的头节点; 如果是上面的第一种情况,那么让第一个链表的下一节点与第二链表的头节点继续比较,然后确定新链表的下一个节点是哪个节点;反之亦然。 反复判断,直至其中一个链表到结尾。 最后让没到结尾的链表剩余的节点连接到新链表的末尾。 代码 遍历实现 public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if (list1 == null) { return list2; } else if (list2 == null) { return list1; } ListNode dummyHead = new ListNode(-1); ListNode cur = dummyHead; // 开始遍历,只要两个链表都还没遍历完 while (list1 != null && list2 != null) { if (list1.val <= list2.val) { cur.next = list1; list1 =

LeetCode练习题 — 回文链表(Java)

别来无恙 提交于 2020-02-29 23:13:28
题目描述: 判断一个链表是否为回文链表。(回文链表即翻转前后相同的链表) 示例: 思路: 判断一个链表是否为回文链表,可以认为是一个比较链表前半部分和后半部分是否相同的问题,可以分三步看: 1、先找到原链表的中间结点 2、将链表的后半部分逆置 3、比较两个链表的每个结点,相同返回true,不同返回false;在这里有一个问题,若原链表的结点个数为奇数,那么新的两个链表结点个数相同,但是若是原链表的结点个数为偶数,那么前半部分形成的链表比后半部分形成的新链表多一个结点(如下图),所以在进行循环比较时,一后半部分形成的链表为条件判断循环是否继续 代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public int size ( ListNode head ) { int size = 0 ; ListNode cur = head ; while ( cur != null ) { size ++ ; cur = cur . next ; } return size ; } public boolean isPalindrome