哈希表的简单介绍

1)哈希表在使用层面上可以理解为一种集合结构

2)如果只有key,没有伴随数据value,可以使用HashSet结构(C++中叫UnOrderedSet)

3)如果既有key,又有伴随数据value,可以使用HashMap结构(C++中叫UnOrderedMap)

4)有无伴随数据,是HashMap和HashSet唯一的区别,底层的实际结构是一回事

5)使用哈希表增(put)、删(remove)、改(put)和查(get)的操作,可以认为时间复杂度为O(1)(常数级别),但是常数时间比较大

6)放入哈希表的东西,如果是基础类型,内部按值传递,内存占用就是这个东西的大小

7)放入哈希表的东西,如果不是基础类型,内部按引用传递,内存占用是这个东西内存地址的大小

有序表的简单介绍

1)有序表在使用层面上可以理解为一种集合结构

2)如果只有key,没有伴随数据value,可以使用TreeSet结构(C++中叫OrderedSet)

3)如果既有key,又有伴随数据value,可以使用TreeMap结构(C++中叫OrderedMap)

4)有无伴随数据,是TreeSet和TreeMap唯一的区别,底层的实际结构是一回事

5)有序表和哈希表的区别是,有序表把key按照顺序组织起来,而哈希表完全不组织

6)红黑树AVL树size-balance-tree跳表等都属于有序表结构,只是底层具体实现不同

7)放入有序表的东西,如果是基础类型,内部按值传递,内存占用就是这个东西的大小

8)放入有序表的东西,如果不是基础类型,必须提供比较器,内部按引用传递,内存占用是这个东西内存地址的大小

9)不管是什么底层具体实现,只要是有序表,都有以下固定的基本功能和固定的时间复杂度

有序表的固定操作

void put(K key,V value):将一个(key,value)记录加入到表中,或者将key的记录更新成value。

v get(k key):根据给定的key,查询value并返回。3) void remove(K key):移除key的记录。

boolean containsKey(K key):询问是否有关于key的记录。

K firstKey():返回所有键值的排序结果中,最左(最小)的那个。6)K lastKey():返回所有键值的排序结果中,最右(最大)的那个。

K floorKey (K key):如果表中存入过key,返回key;否则返回所有键值的排序结果中,,,key的前一个。

K ceilingKey (K key):如果表中存入过key,返回key;否则返回所有键值的排序结果中,key的后一个。

以上所有操作时间复杂度都是0(logN),N为有序表含有的记录数

链表

链表知识学习:https://blog.csdn.net/m0_57950108/article/details/121639962

java知识回忆:https://www.liaoxuefeng.com/wiki/1252599548343744/1260454185794944

单向链表反转

假设有以下链表

1→2→3→null

需要返回的链表是

3→2→1→null

怎么做?

一般有两种做法

方法一:使用一个中间变量保存下一节点指针

视频讲解:https://www.bilibili.com/video/BV1KZ4y157Up/?spm_id_from=333.788

单链表的每个节点都只存了它的下一节点的地址指针

因此,设三个变量

pre:代表指向当前节点上一个节点的指针

cur:代表指向当前节点的指针

tmp:用于保存指向当前节点下一个节点的指针

public class LinkNode ReverseList {
# 定义一个单链表
public static class Node {
public int value; //节点储存的值
public Node next; //节点储存的下一节点的地址指针 public Node(int data) {
this.value = data;
}
}
# 创建一个单链表反转方法
public static Node reverseList(Node head) {
Node pre = null; //指向当前节点的前一个节点的指针
Node cur = head; //指向当前节点的指针
Node tmp; //用于保存当前节点的下一节点,防止链表断掉
while (cur != null) {
//先将当前节点的后一个节点的地址保存
tmp = cur.next;
//将当前节点的后一个节点指针指向当前节点的前一个节点
cur.next = pre;
//将pre指向当前节点位置
pre = cur;
//将当前节点位置后移
//此时已经是2-1-3了
cur = tmp;
}
//等pre指到链表尾部(null)时结束并返回前一个值
//此时链表变为3-2-1
return pre;
} public static void printLinkedList(Node head) {
System.out.print("Linked List: ");
while (head != null) {
System.out.print(head.value + " ");
head = head.next;
}
System.out.println();
} public static void main(String[] args) {
Node head1 = new Node(1);
head1.next = new Node(2);
head1.next.next = new Node(3);
printLinkedList(head1);
head1 = reverseList(head1);
printLinkedList(head1);
} }

方法二:不使用中间变量(via左神)

public class LinkNode ReverseList {
# 定义一个单链表
public static class Node {
public int value; //节点储存的值
public Node next; //节点储存的下一节点的地址指针 public Node(int data) {
this.value = data;
}
}
# 创建一个单链表反转方法
public static Node reverseList(Node head) {
Node pre = null; //指向当前节点的前一个节点的指针
Node next = null; //指向当前节点的后一个节点的指针
//若头结点不为空
while (head != null) {
//先将头结点的后一个节点的地址保存
next = head.next;
//将头结点的后一个节点指针指向头结点的前一个节点
head.next = pre;
//将pre指向当前节点(头结点)位置
pre = head;
//将当前节点位置后移,移动到下一个数
//此时已经是2-1-3了
head = next;
}
//等pre指到链表尾部(null)时结束并返回前一个值
//此时链表变为3-2-1
return pre;
} public static void printLinkedList(Node head) {
System.out.print("Linked List: ");
while (head != null) {
System.out.print(head.value + " ");
head = head.next;
}
System.out.println();
} public static void main(String[] args) {
Node head1 = new Node(1);
head1.next = new Node(2);
head1.next.next = new Node(3);
printLinkedList(head1);
head1 = reverseList(head1);
printLinkedList(head1);
} }

【算法day6】哈希表、有序表、链表(反转单链表)的更多相关文章

  1. Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

    Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ...

  2. 特殊的反转单链表算法(C++)

    普通的单链表反转算法 大学的时候也做过好几次单链表的反转,记得当时都是用三个变量不断修改next的值然后实现反转. ListNode* reverseList(ListNode* head) { Li ...

  3. [算法][LeetCode]Linked List Cycle & Linked List Cycle II——单链表中的环

    题目要求 Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up: Can you so ...

  4. [C++]线性链表之单链表

    [文档整理系列] 线性链表之单链表 /* 问题描述:线性表____链表_____单链表 @date 2017-3-7 */ #include<iostream> using namespa ...

  5. 数据结构5: 链表(单链表)的基本操作及C语言实现

    逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储. 由于分散存储,为了能够体现出数据元素之间的逻辑关 ...

  6. 【数据结构】单链表介绍及leetcode206题反转单链表python实现

    题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...

  7. 在O(n) 时间复杂度,O(1)空间复杂度内反转单链表

    在LeetCode中看到判断回文的程序:https://leetcode.com/problems/palindrome-linked-list/ 里面用单链表来存储数据,先反转前半部分的单链表,然后 ...

  8. 以K个为一组反转单链表,最后不足K个节点的部分也反转

    package StackMin.ReverseList_offer16; public class ReverseKgroup_extend_offer16 { /** * 分组反转单链表,最后不足 ...

  9. java练习题:用递归反转单链表

    问题:用递归反转单链表. 单链表结构: class ListNode{ int val; ListNode next; ListNode(int value){ this.val=value; }} ...

  10. 查找(顺序表&有序表)

    [1]查找概论 查找表是由同一类型是数据元素(或记录)构成的集合. 关键字是数据元素中某个数据项的值,又称为键值. 若此关键字可以唯一标识一个记录,则称此关键字为主关键字. 查找就是根据给定的某个值, ...

随机推荐

  1. 【Go WEB进阶实战】开源的电商前后台API系统

    前言 最近有很多小伙伴私信我:在学完Go基础后,想使用一个框架实战一个商业项目,但是又苦于不知道选择什么框架,更不知道做什么商业项目. 为了解决大家这些问题,我结合自己的项目经历,为大家开源了一个简单 ...

  2. 【JS 逆向百例】某易支付密码 MD5+AES 加密分析

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...

  3. docker 发布web项目到linux

    一.准备工作 1.连接到Liunx的工具 MobaXterm 填好Ip 直接点ok就行 输入用户名和密码进入系统 2.已发布的.netcore网站或微服务 在要发布的项目上右键---->添加-- ...

  4. 8.5 C++ 继承与多态

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  5. CE修改器入门:代码替换功能

    某些游戏重新开始时,数据会存储在与上次不同的地方, 甚至游戏的过程中数据的存储位置也会变动.在这种情况下,你还是可以简单几步搞定它.这次我将尽量阐述如何运用"代码替换"功能,第五关 ...

  6. 【链表】链表的合并【经典面试OJ详解】【力扣21,力扣23】超详细的算法教程

    链表的合并 导航小助手 说在前面 题目链接 链表结构 OJ21.合并两个有序链表 题目描述和算法分析 接口的完整实现代码 OJ23.合并K个升序链表 题目描述和算法分析 接口的完整实现代码 尾声 说在 ...

  7. Ubuntu+Minio对象存储+pm2进程管理

    Minio是一个go编写的高性能对象存储服务,它兼容Amazon S3 API.无论是静态网站的托管,还是数据存储分析,亦或是数据的备份与恢复等多种场景下,都可以为我们提供解决方案. ubuntu安装 ...

  8. korean doll likeness模型|Japanese-doll-likeness模型获取及使用

    1.模型 之前给大家写了Mac安装stable-diffusion-webui绘制AI妹子保姆级教程,教程在下面 [奶奶看了也不会]AI绘画 Mac安装stable-diffusion-webui绘制 ...

  9. 一行命令找出 Linux 中所有真实用户

    哈喽大家好,我是咸鱼. 接触过 Linux 的小伙伴们都知道在 Linux (或者说类 Unix)中,有三种类型的用户: 超级用户(UID 为 0):即 root 用户,拥有最高权限. 系统用户(UI ...

  10. CF1795

    A 先判断初始行不行,再模拟加入. B 题意:数轴上给定一些线段,和点 \(t\).问能否删去一些线段,使得 \(t\) 变成唯一的覆盖次数最多的点. 差分 + 贪心. C 有 \(n\) 杯水,\( ...