【算法day6】哈希表、有序表、链表(反转单链表)
哈希表的简单介绍
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】哈希表、有序表、链表(反转单链表)的更多相关文章
- Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现
Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ...
- 特殊的反转单链表算法(C++)
普通的单链表反转算法 大学的时候也做过好几次单链表的反转,记得当时都是用三个变量不断修改next的值然后实现反转. ListNode* reverseList(ListNode* head) { Li ...
- [算法][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 ...
- [C++]线性链表之单链表
[文档整理系列] 线性链表之单链表 /* 问题描述:线性表____链表_____单链表 @date 2017-3-7 */ #include<iostream> using namespa ...
- 数据结构5: 链表(单链表)的基本操作及C语言实现
逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储. 由于分散存储,为了能够体现出数据元素之间的逻辑关 ...
- 【数据结构】单链表介绍及leetcode206题反转单链表python实现
题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...
- 在O(n) 时间复杂度,O(1)空间复杂度内反转单链表
在LeetCode中看到判断回文的程序:https://leetcode.com/problems/palindrome-linked-list/ 里面用单链表来存储数据,先反转前半部分的单链表,然后 ...
- 以K个为一组反转单链表,最后不足K个节点的部分也反转
package StackMin.ReverseList_offer16; public class ReverseKgroup_extend_offer16 { /** * 分组反转单链表,最后不足 ...
- java练习题:用递归反转单链表
问题:用递归反转单链表. 单链表结构: class ListNode{ int val; ListNode next; ListNode(int value){ this.val=value; }} ...
- 查找(顺序表&有序表)
[1]查找概论 查找表是由同一类型是数据元素(或记录)构成的集合. 关键字是数据元素中某个数据项的值,又称为键值. 若此关键字可以唯一标识一个记录,则称此关键字为主关键字. 查找就是根据给定的某个值, ...
随机推荐
- [转帖]/etc/passwd文件 各个字段详解
转载自:https://www.sohu.com/a/320177323_505901 /etc/passwd文件: 系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读 ...
- [转帖]kubelet 原理解析五: exec的背后
https://segmentfault.com/a/1190000022163850 概述 线上排查pod 问题一般有两种方式,kubectl log或者kubectl exec调试.如果你的 lo ...
- Mysql localhost 无法登录 root用户的处理过程
问题说明: 前段时间同事修改密码, 但是发现修改了密码之后,外面可以连接root用户, 但是本地无法连接了. 怀疑是密码修改存在问题,需要重新进行处理 这里进行简单的描述. 问题现象 使用 mysql ...
- vm-storage在新metric占整体1%情况下的写入性能测试
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 根据正式环境实际的数据统计,全新的metric占整体的me ...
- 【K哥爬虫普法】网盘用的好,“艳照门”跑不了
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识,知 ...
- Golang zip压缩文件读写操作
创建zip文件 golang提供了archive/zip包来处理zip压缩文件,下面通过一个简单的示例来展示golang如何创建zip压缩文件: func createZip(filename str ...
- ActiveReports报表行号
=RunningValue(Fields!字段名称.Value, CountDistinct, "矩表分组名称") RunningValue(Fields!区域.Value, Co ...
- 【六】gym搭建自己环境升级版设计,动态障碍------强化学习
相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...
- 使用CAShapeLayer,UIBezierPath,CAGradientLayer构建边框颜色会旋转的六边形
主要思路是: 1.使用UIBezierPath绘制一个六边形路径 2.创建一个CAShapeLayer图层,将这个六边形path设置到CAShapeLayer属性上.然后设置fillColor为透明, ...
- Java并发(八)----使用线程避免cpu占用100%
1.sleep 实现 在没有利用 cpu 来计算时,不要让 while(true) 空转浪费 cpu,这时可以使用 yield 或 sleep 来让出 cpu 的使用权给其他程序 while(true ...