链表数组

  • 链表数组是什么?
  • 链表数组实现

链表数组是什么?

链表数组是由链表构成的数组,即数组每一个元素都是链表

链表数组实现

  • getBucket()根据hashcode获取桶数
  • Node数组元素节点

put()获取桶数,判断桶里是否有元素

  • 若无则存到桶内
  • 若有则循环判断当前key是否存在,若存在则覆盖value,不存在则进行链接到末尾

remove()获取桶数,桶里是否有元素,若无则直接返回null,若有则再判断第一个元素是否是要删除的元素

  • 若是则断开头节点,让下一个元素成为头节点
  • 若不是则循环遍历链表,判断是否有对应元素,若有且其为最后一个,则直接断开,若有但不是最后一个则断开并链接下一个
class MyLinkListArray<E> {private int capacity = 5;Node<E>[] tables;MyLinkListArray() {tables = new Node[capacity];}private int getBucket(int hashcode) {return hashcode % capacity;}private static class Node<E> {E key;E value;Node<E> next;Node(E key, E value, Node<E> next) {this.key = key;this.value = value;this.next = next;}}public void put(E key, E value) {int bucket = getBucket(key.hashCode());Node<E> firstNode = tables[bucket];if (firstNode == null) {tables[bucket] = new Node<>(key, value, null);} else {while (firstNode.next != null) {if (firstNode.key == key) {firstNode.value = value;return;}firstNode = firstNode.next;}firstNode.next = new Node<>(key, value, null);}}public void remove(E key) {int bucket = getBucket(key.hashCode());Node<E> firstNode = tables[bucket];if (firstNode == null) {return;}if (firstNode.key == key) {Node<E> nextNode = firstNode.next;firstNode.next = null;tables[bucket] = nextNode;} else {while (firstNode.next != null) {Node<E> nextNode = firstNode.next;if (nextNode.key == key) {if (nextNode.next != null) {Node<E> temp = nextNode.next;nextNode.next = null;firstNode.next = temp;} else {firstNode.next = null;}} else {firstNode = nextNode;}}}}public E get(E key) {int bucket = getBucket(key.hashCode());Node<E> firstNode = tables[bucket];if (firstNode == null) {return null;}if (firstNode.key == key) {return firstNode.value;} else {while (firstNode.next != null) {firstNode = firstNode.next;if (firstNode.key == key) {return firstNode.value;}}}return null;}public void set(E key, E value) {int bucket = getBucket(key.hashCode());Node<E> firstNode = tables[bucket];if (firstNode.key == key) {firstNode.value = value;} else {while (firstNode.next != null) {firstNode = firstNode.next;if (firstNode.key == key) {firstNode.value = value;}}}}@NonNull@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("[");for (int i = 0; i < capacity; i++) {Node<E> firstNode = tables[i];if (firstNode != null) {stringBuilder.append("[" + firstNode.key + "," + firstNode.value + "]");while (firstNode.next != null) {firstNode = firstNode.next;stringBuilder.append("-[" + firstNode.key + "," + firstNode.value + "]");}stringBuilder.append(", ");}}stringBuilder.replace(stringBuilder.length() - 2, stringBuilder.length(), "");stringBuilder.append("]");return stringBuilder.toString();}
}

get()获取桶数,并判断桶内是否有元素,若无则返回null,若有则判断是否是第一个元素

  • 若是则返回头节点的value
  • 若不是则循环遍历查找是否有对应的key并返回其value

set获取桶数,判断是否是第一个元素

  • 若是则设置头节点的value
  • 若不是则循环遍历查找是否有对应的key并设置其value

测试代码,toString打印如[[0,0], [1,1]-[6,6]-[11,11], [2,2]]

MyLinkListArray<Integer> myLinkListArray = new MyLinkListArray<>();
myLinkListArray.put(0, 0);
myLinkListArray.put(1, 1);
myLinkListArray.put(2, 2);
myLinkListArray.put(6, 6);
myLinkListArray.put(11, 11);
System.out.println(myLinkListArray);
System.out.println(myLinkListArray.get(1));
System.out.println(myLinkListArray.get(6));
System.out.println(myLinkListArray.get(3));
myLinkListArray.set(6, 7);
System.out.println(myLinkListArray);
myLinkListArray.remove(0);
System.out.println(myLinkListArray);
myLinkListArray.remove(6);
System.out.println(myLinkListArray);

数据结构——链表数组相关推荐

  1. 数据结构栈队列链表数组

    目录: 数据结构 栈(stack) 队列 链表 数组 数据结构 数据结构是什么 简单来说,数据结构就是设计数据以何种方式存储在计算机中 比如:列表,集合,与字典等都是一种数据结构 程序 = 数据结构 ...

  2. 数据结构(数组结构、链表结构)

    本来第一篇文章准备写点关于map的,但是考虑到map中可能也牵扯到数据结构,所以先随便写点就当做铺垫吧! 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 1.集合 数据结构中的 ...

  3. 数据结构之数组和链表的区别

    第一题便是数据结构中的数组和链表的区别 数组(Array) 一.数组特点: 所谓数组,就是相同数据类型的元素按一定顺序排列的集合:数组的存储区间是连续的,占用内存比较大,故空间复杂的很大.但数组的二分 ...

  4. 数据结构 - 链表和数组的区别

    文章目录 数据结构 - 链表和数组的区别 1.在内存上 2.时间复杂度 3.链表的结构 4.各自的优缺点 5.为什么使用较常用的是单头链表 数据结构 - 链表和数组的区别 1.在内存上 数组是连续内存 ...

  5. 初学数据结构--链表

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在这一章,我将介绍另外一种非常重要的线性数据结构--链表.在之前介绍的动态数组,栈和队列这三种数据结构,底层其实依托于静 ...

  6. 008 数据结构逆向—数组(简单版)

    文章目录 前言 逆向背包数组 一维背包数组 二维背包数组 数组结构分析 总结 前言 对于游戏逆向来说,核心需求其实就只有两个 追踪游戏数据 定位游戏功能call 对于追踪游戏数据来说,单纯从一个寄存器 ...

  7. 数据结构 - 链表 - 面试中常见的链表算法题

    数据结构 - 链表 - 面试中常见的链表算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图. ...

  8. 数据结构链表之符号表,Python3实现——8

    数据结构链表之符号表 符号表的介绍 之前章节介绍的顺序表和链表都是一个节点储存一个元素的表,但在日常生活中我们还有很多一次需要储存成对或多个值的情况,例如: 符号表最主要的目的将一对元素,用一个键和一 ...

  9. 剑指offer(C++)-JZ6:从尾到头打印链表(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回). 如输入{ ...

最新文章

  1. 敲诈英伟达的竟然是一群未成年???
  2. C++容器适配器之priority_queue
  3. 2014年中回首与展望
  4. 人脸识别双目摄像头何时同时打开双目
  5. mkdir 函数_PHP mkdir()函数与示例
  6. android if else语句,Android一起执行IF和ELSE语句
  7. Unity如何设置两个玩家
  8. 拓端tecdat|SARIMA,神经网络,RNN-LSTM,SARIMA和RNN组合方法预测COVID-19每日新增病例
  9. mooc-IDEA 应用快捷键自动创建测试类--010
  10. 统计123出现次数_Java字符串03-统计大小写字母出现的次数
  11. Object类中的wait()和notify()
  12. C++——判身份证号码真伪
  13. 短视频剪辑技巧及运营方法 ,让你的视频更自然
  14. python程序设计基础课后答案-Python语言程序设计基础(第2版)嵩天课后答案
  15. 简易串口助手通信(齐全) 可实现ASII和十六进制发送指令 并显示
  16. Android攻城狮ScrollView
  17. blender关于怎么导出上完色的FBX格式模型、以及导出后再导入,材质预览和渲染模式下材质透明度混乱的解决办法。
  18. (环境搭建+复现)CVE-2020-1472 NetLogon 域内提权漏洞
  19. android 解锁过程,Android-解锁与刷机(以一加为例)
  20. 基于时延法的麦克风阵列声源定位分析

热门文章

  1. Linux 必学的 60 个命令__1__网络安全
  2. MySQL查询累计值的方法
  3. Linux命令总结思维导图
  4. B站视频播放速度设置
  5. 使用kali nethunter执行badUSB攻击--基于Rucky工具
  6. 北京奥运圣火传递路线(途经城市/时间)
  7. 巨蟹座 55e外表达2000度 火山活泼岩浆遍布
  8. 什么是虚拟DOM?虚拟DOM的定义和作用?
  9. ASEMI-S4贴片二极管的极性鉴别和好坏测量
  10. java mkdirs 看不到_文件mkdirs()方法在android / java中不起作用