王道训练营Day24——Linked
数据结构
什么是数据结构?
数据结构是一种或多种特定关系的数据元素集合 数据结构=数据+结构
另:Java的意义
.java–>.class–>根据.class文件所产生的的类,才具有意义
集合类
- 为什么需要集合类?
很多情况下,我们需要对一组对象进行操作。而且很可能事先并不知道到底有多少个对象。为了解决这个问题呢,Java 就提供了集合类供我们使用。(存储更多类型问题, 扩容问题, 内存空间浪费问题, 数据查找问题, 数据删除问题等等) 去理解什么是集合类的时候可以在功能上与数据类比,结构上模仿了数据结构中的集合,线性表,树等等,就是形式上与数据结构类比。 - 集合类的特点
a. 只能存储引用数据类型
b. 可以自动地调整自己的大小 - 数组和集合类都是容器,它们有何不同?
a. 数组可以存储基本数据类型的数据,集合不可以。
b. 数组的长度是固定的,集合可以自动调整自己的大小。
c. 数组的效率高,相对来说集合效率比较低。
d. 数组没有API,集合有丰富的API。
数据结构和Java关系
本质上,数据结构和Java没有任何关系。但是,在Java的集合类中,为了更方便的构建,Java采用了数据结构的结构(数据结构的构建方式),用于描述了一些JAVA对象的底层数据的组成关系 。模仿了数据结构中的结构(就是类似于链表,栈,这种结构)从而更方便的存储数据。
结构
结构的表示可以分为两种:顺序存储结构 (顺序映像) 和 链式存储结构 (非顺序映像)。
顺序映像:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。(数组)
非顺序映像:借助指示元素存储地址的”指针”,来表示数据元素的逻辑关系。(链表)
数据结构的基本结构
集合,线性表,树,图
数组
数组的下标为什么从0开始
从两个层面出发
第一层:历史遗留问题,在以前硬件资源是很昂贵的
第二层:方便计算
数组最主要的特点
数组是连续存储随机访问的
数组为什么比链表效率高
数组是连续存储的所以根据首地址,可以随意查询,
增加
最坏情况 o(n)
最好情况 o(1)
平均情况(平均移动n/2个元素): o(n)
删除 (保证元素的顺序)
最好情况:O(1)
最坏情况:移动n-1个元素,O(n)
平均情况:移动(n-1)/2个元素,O(n)
查找
a. 根据索引查找元素:O(1)
b. 查找数组中与特定值相等的元素
①大小无序:O(n)
②大小有序:O(log2n)
数组: 添加和删除慢 o(n)
查找快: 尤其根据下标查找 大小有序的折半查找
作业
构建一个链表, 查找链表的中间元素
解题思想:分为快慢指针,快指针一次走两个,慢指针一次走一个,当快指针走到链表结尾,慢指针更好走到中间。
public class GetMid {public static void main(String[] args) {//构建链表Node one = new Node(null, "one");Node two = new Node(null, "two");Node three = new Node(null, "three");Node four = new Node(null, "four");Node five = new Node(null, "five");Node six = new Node(null, "six");one.next = two;two.next = three;three.next = four;four.next = five;five.next = six;six.next = null;System.out.println(getMidNode(two).value);}public static Node getMidNode(Node begin) {Node quick = begin;Node slow = begin;//分为快慢两个指针while (quick.next != null && quick.next.next != null) {quick = quick.next.next;slow = slow.next;}return slow;}
}class Node {String value;Node next;public Node(Node next, String value) {this.value = value;this.next = next;}public Node() {}
}
判断一个链表是否有环
结题思路:分为两个快慢指针,如果链表中有环,那么在环中,快慢指针一定会相遇
Q1:快指针会越过慢指针吗?
不会,在环中,相当于快指针一直在追慢指针,相对于慢指针,快指针一次移动一个,并不会越过。也可以这么想,对于快指针和慢指针,他们只会出现两种情况:慢指针在快指针前一个,或慢指针在快指针前两个,对于这两种情况,无论怎么运行,快指针都不会越过慢指针。
对于代码问题,一般要转变成数学问题
public class JudgeCircular {public static void main(String[] args) {
// 构建链表CNode first = new CNode(null, "first", true);CNode second = new CNode(null, "second", true);CNode third = new CNode(null, "third", true);CNode forth = new CNode(null, "forth", true);CNode fifth = new CNode(null, "fifth", true);first.next = second;second.next = third;third.next = forth;forth.next = fifth;fifth.next = second;System.out.println(judge(fifth));}public static boolean judge(CNode begin) {CNode quick = begin;CNode slow = begin;while (quick != null && quick.next != null) {quick = quick.next.next;slow = slow.next;if (slow == quick) {return true;}}return false;}
}class CNode {CNode next;String val;boolean judgeC;public CNode(CNode next, String val, boolean judgeC) {this.next = next;this.val = val;this.judgeC = judgeC;}public CNode() {}
}
王道训练营Day24——Linked相关推荐
- 【王道训练营 C/C++方向基础 60 题(1-10)】
1.有一个函数如下: 输入 x 的值,计算出相应的 y 值. #include<stdio.h> int main(){int x,y;printf("x=");sca ...
- 广义估计方程估计方法_广义估计方程简介
广义估计方程估计方法 A key assumption underpinning generalized linear models (which linear regression is a typ ...
- 西北农林科技大学linux实验,2021双非科班调剂985(一志愿中科大,调剂上岸西北农林科技大学)初试复试经验帖...
马上毕业啦,回想过去的一年想通过这一份经验帖给自己的大学画上一个圆满的句号,很多同学应该看过其他学长学姐各种各样的经验帖和各科的时间规划,本文就不过多谈各科的时间安排,主要是阐述自己这一年各科踩过的坑 ...
- 数据结构--顺序表、链表、栈、队列、树、文件(visual studio可运行)
顺序表的顺序存储(增删查) #include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef int Elem ...
- 【C语言】C 语言为什么叫 C 语言呢?
笔记改自于王道训练营资料 其实是因为先有高级语言ALGOL 60,简称 A 语言,后来经过简化,变为 BCPL 语言,简称 B 语言,而 C 语言是在 B 语言的基础之上发展而来的,所以就称为 C 语 ...
- 野指针 空指针 悬空指针 智能指针
C语言中"野指针"."悬空指针"是什么? C语言中"野指针"."悬空指针"是什么?_不脱发的程序猿的博客-CSDN博客_ ...
- c++下程序的运行(第3方库的安装及安装gdal)
C++安装第三方库 1 概览 2 编译,首先要熟悉程序编译过程(预处理->编译->汇编->链接) 2.1 编译流程4步 2.1.1 1 预处理 2.1.2 2 编译 2.1.3 3 ...
- C语言教程Day01
文章目录 写本文,只是方便个人复习!!! C语言教程Day01--数据类型 第一章 VS2017基本操作 1.1 创建项目(Project) 1.2 添加源文件 1.3 编写代码并生成程序 1.4 编 ...
- 还是一篇来自Java14th的学习、面试经验分享
和大多数道友一样,我也是因考研与王道结缘,大学期间考过一次研,数学单科没过线,无缘梦想大学,没有参加秋招和春招,毕业后直接在家附近学校的逸夫图书馆备考,悲催的是,这次也是单科没过线.考研的苦我想大部分 ...
- 极客时间 算法训练营 毕业总结
不知不觉8周的算法训练营也接近尾声,这期间训练营对自己的影响有三方面 一方面是收获了刻意练习,终身成长这些可以产生长远影响的思想,这里推荐三本书 卡罗尔·德韦克的<终身成长>.安德斯·艾利 ...
最新文章
- java高级之Io流
- 给你汇报Struts2 S2-016漏洞修复的总结
- 如何友好的把Python和Bash结合在一起
- elasticsearch根据某个字段来查询,以及通过时间筛选
- STM32之JScope调试
- 2018最新完整版黑马安卓android第52期(基础+就业班)61G打包
- 网易云音乐软件没有视频的版本
- 9-11-12 h5总结~文档对象模型、点击事件
- 计算机关闭账号用户控制好吗,Win10系统彻底关闭用户帐户控制的方法
- 内存虚拟化硬件基础——EPT
- 真香,50行Java代码爬取妹子套图!
- 17计算机一级,全国计算机等级考试一级17
- Appium: Windows系统桌面应用自动化测试(二)
- LTE:RA-RNTI、T-CRNTI、C-RNTI
- 模拟koa洋葱模型实现
- 习题 3.1 假如我国国民生产总值的年增长率为9%,计算10年后我国国民生产总值与现在相比增长多少百分比。
- 判断url链接是否有效的几种方法
- oracle ebs wsh picking batch,OracleEBSShipping(WSH)模块日志收集方法
- PADS运行脚本出现“Active X Automation:server could not be found”
- python打印数组部分元素_Python打印输出数组中全部元素