【18】数据结构

线性表

  • 最基本和最常用的一种数据结构
  • 由零个或多个数据元素组成的有限序列,表示线性结构
  • 分为顺序存储结构和链式存储结构两种

特点:

  • 数据元素的数据类型相同
  • 位顺从1开始
  • 有唯一前驱和后继(除第一个和最后一个元素外)

顺序存储结构

  • 用一段连续的地址存储单元一次存储线性表中的数据元素。

插入数据原理:

  1. 判断插入新元素空间是否足够
  2. 若空间不足:申请更大的内存空间;旧内存空间数据拷贝到新的空间;释放旧空间内存
  3. 新元素插入

链式存储结构

  • 用一段不连续的内存空间存储线性表中的数据元素。

单向链表

在这里插入图片描述

插入数据原理:

  1. 创建新的节点
  2. 使用循环指针变量找到需要插入节点的位置
  3. 插入节点:
    newnode->next = pCurrent->next;
    pCurrent->next = newnode;
  4. 更改size:size++

循环链表

  • 链表的最后一个节点的next不指向空,指向头结点(或第一个有效节点)。

判断是否遍历到最后一个节点的方式:

  • 判断next是不是等于头结点
  • 判断是否遍历到size()

判断是否是循环链表的方式:

  • 令size=n*size(),判断链表是否能遍历n遍

插入数据原理:

  1. 创建新的节点
  2. 使用循环指针变量找到需要插入节点的位置
  3. 插入节点:
    newnode->next = pCurrent->next;
    pCurrent->next = newnode;
  4. 更改size:size++
约瑟夫问题
  • n个人围成一个圆圈,编号分别为1~n;
  • 第一个人开始从1开始顺时针报数,报到第m个人,令其出列;
  • 再从下一个人开始从1顺时针报数,报到第m个人,再令其出列,…,如此循环;
  • 求出列顺序。

实现方法:

  • 使用循环链表模拟n个人围成的圆圈
  • 采用循环链表的查找及删除、打印方法解决该问题

栈和队列

  • stack,又称堆栈,是运算受限的线性表
  • 先进后出
  • 栈的入口出口都在栈的顶端

队列

  • queue,是运算受限的线性表
  • 先进先出
  • 队列的入口、出口各占一侧

  • 树是一些节点的集合(可以使空集)
  • 若不是空集,则树由称作根的节点和0或多个飞空子树组成
  • 树叶:没有儿子的节点

二叉树

  • binary tree,是每个节点不超过2的树(左子树和右子树)

排序树

  • 在二叉树的基础上,元素右大小顺序
  • 左子树小,右子树大

平衡树

  • 左子树和右子树数量相等

红黑树

  • 趋近于平衡树

跳表和散列

哈希表

  • JDK8之前,底层采用数组+链表实现,可以说是一个元素为链表的数组

  • JDK8以后,在长度比较长的时候,底层实现了优化
    请添加图片描述

  • 哈希表是一个默认长度为16的数组

  • 先对元素取哈希值,并取余计算存储位置

  • 在该存储位置处若无元素直接存储,若有元素先依次比较元素哈希值,若相同则使用equals()方法比较元素是否相同,若相同则不存储

  • 相同位置的不同元素通过链表存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值