链表的算法

每日一句:二十岁的年纪,为什么不敢去折腾?哪怕最后失败,你也还有从头再来的资本。

正如乔布斯所说:你本就一无所有,没有理由不去追随你的内心。

目录

哈希表的简单介绍

有序表的简单介绍

有序表的固定操作

判断一个链表是否为回文结构

 将单向链表按某值划分成左边小,中间相等,右边大的形式

复制含有随机指针节点的链表

两个单链表相交的一系列问题

一个链表怎么判断有无环,若有环,返回第一个入环节点


哈希表的简单介绍

  1. 哈希表在使用层面上可以理解为一种集合结构
  2. 如果只有key,没有伴随数据value,可以使用HashSet结构
  3. 如果既有key,又有伴随数据value,可以使用HashMap结构
  4. 有无伴随数据,是HashMap和HashSet唯一的区别,底层的实际结构是一回事
  5. 使用哈希表增put,删remove,改put和查get的操作,可以认为时间复杂度为O(1),但常数时间比较长
  6. 放入哈希表的东西,如果不是基础类型,内部按引用传递,内存占用是这个东西内存地址的大小

有序表的简单介绍

  1. 有序表在使用层面上可以理解为一种集合结构
  2. 如果只有key,没有伴随结构value,可以使用TreeSet结构
  3. 如果既有key,又有伴随结构value,可以使用TreeMap结构
  4. 有无伴随数据,是TreeSet和TreeMap唯一的区别,底层的实际结构是一回事
  5. 有序表和哈希表的区别是,有序表把key按照顺序组织起来,而哈希表完全不组织
  6. 红黑树、AVL树、size-balance-tree和跳表等都属于有序表结构,只是底层具体实现不同
  7. 放入有序表的东西,如果是基础类型,内部值传递,内存占用就是这个东西大小
  8. 放入有序表的东西,如果不是基础类型,必须提供比较器,内部按引用传递,内存占用是这个东西内存地址的大小
  9. 不管是什么底层具体实现,只要是有序表,都有以下固定的基本功能和固定的时间复杂度

有序表的固定操作

  1. void put(K key,V value);将一个(key,value)记录加入到表中或者将key的记录更新成value
  2. V get(K key);根据给定的key查询value并返回
  3. Void remove(K key) 移除key的记录
  4. Boolean containskey(K key)询问是否有关于key的记录
  5. K firstKey() 返回所有键值的排序结果中最左(小)的那个
  6. K lastKey() 返回所有键值的排序结果中最右(大)的那个
  7. K floorkey(K key) 如果表中存入过Key,返回Key;否则返回所有键值的排序结果中Key的前一个
  8. K ceilingkey(K key) 如果表中存入过Key,返回Key;否则返回所有键值的排序结果中Key的后一个
  9. 以上所有操作时间复杂度都是O(),N为有序表含有的记录数

单链表的节点结构

Class Node<V>

{ V value;

 Node next;

}由以上结构的节点依次连接起来所形成的链叫单链表结构

双链表的节点结构

Class Node<V>

{ V value;

 Node next;

 Node last;

}由以上结构的节点依次连接起来所形成的链叫双链表结构

单链表和双链表结构只需要给定一个头部节点head,就可以找到剩下的所有节点

面试时链表解题的方法论

  1. 对于笔试,不用太在乎空间复杂度,一切为了时间复杂度
  2. 对于面试,时间复杂度依然放在第一位,但一定要找到空间最省的方法

重要技巧:

  1. 额外数据结构记录(哈希表等)
  2. 快慢指针

判断一个链表是否为回文结构

给定一个单链表的头节点head,请判断该链表是否为回文结构1—>2—>1,返回true;1—>2—>2—>1,返回true;1—>2—>3,返回false;如果链表长度为N,时间复杂度O(N),额外空间复杂度O(1)

笔试:

方法一:1—>2—>3—>3—>2—>1,依次放到栈里,从栈里弹出的顺序与原链表逆序的顺序对比

方法二:用N2方法,找快慢指针;左边开始遍历,每遍历一个,栈弹出一个对比

怎么只把右部分放入栈里去?

快慢指针  快指针每次走2步,慢指针每次走1步

快指针走完时,慢指针来到中间位置,这时把慢指针后边放入栈里去

 

面试:

快指针每次走2步,慢指针每次走1步

快指针走完时,慢指针来到中间位置

1—>2—>3<—2<—1

A—>         <—B

如果A,B每步都一样则回文

 将单向链表按某值划分成左边小,中间相等,右边大的形式

【题目】给定一个单链表的头节点head,节点的值类型是整型,再给定一个整数pivot.实现一个调整链表的函数,将链表调整为左部分都是值小于pivot的节点,中间部分都是值等于pivot的节点,右部分都是值大于pivot的节点

【进阶】在实现原问题功能的基础上增加如下要求:调整后所有小于/等于/大于pivot的节点之间的相对顺序和调整前一样

时间复杂度O(N);额外空间复杂度O(1)(用有限几个变量)

笔试:

把单链表每个节点放到数组里,在数组上partition,在数组里把每个node串起来

面试:

代码:

复制含有随机指针节点的链表

一种特殊的单链表节点类描述如下:

Class Node{

int  value;

Node  next;

Node  rand;

Node(int val)

{ value=val;}

}rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节点,也可能指向null。给定一个由Node节点类型组成的无环单链表的头节点head,请实现一个函数完成这个链表的复制,并返回复制的新链表的头节点。时间复杂度O(N),额外空间复杂度O(1)

方法一:

代码:

第一步不用考虑指针怎么连,把老链表都拷贝新链表放到map里去

第二步设置新链表的rand,next方向指针,遍历哈希表或老链表

方法二:

 不用哈希表,利用克隆节点对应的位置关系对应

生成克隆节点,但把克隆节点放在老链表下一个,最后在next方向上把新老指针分离出来

代码:

两个单链表相交的一系列问题

【题目】给定两个可能有环也可能无环的单链表,头节点head1和head2,请实现一个函数,如果两个链表相交,请返回相交的第一个节点,如果不相交,返回null

【要求:】如果两个链表长度之和为N,时间复杂度O(N),额外空间复杂度O(1)

一个链表怎么判断有无环,若有环,返回第一个入环节点

如果链表上有环,快F,慢S指针一定相遇,相遇后,快指针回到开头,慢指针在原地;之后快慢指针都只走一步,它俩一定在第一个入环节点处相遇

  1. 两个链表都无环

遍历第一个链表,一直遍历到最后一个节点,即为end1,长度len1

遍历第二个链表,一直遍历到最后一个节点,即为end2,长度len2

判断end1和end2内存地址是不是一个

若不是一个head1和head2不可能相交

若是一个,找到相交部分第一个节点

  1. 一个有环,另一个没有环——不可能相交
  2. 两个链表都有环

 

情况讨论:

 

两个无环链表相交问题:

 

 

两个有环链表相交问题:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/51276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 性能优化四:UI耗时函数、资源加载、卸载API

UI耗时函数 1.1 Canvas.SendWillRenderCanvases 这个函数是由于自身UI的更新&#xff0c;产生的耗时 1. 这里更新的是vertex 属性&#xff0c;比如 color、tangent、position、uv&#xff0c;修改recttransform的position、scale&#xff0c;rotation并不会导致顶点属性改变…

100个网络安全测试面试题

1、Burpsuite常用的功能是什么&#xff1f; 2、reverse_tcp和bind_tcp的区别&#xff1f; 3、拿到一个待检测的站或给你一个网站&#xff0c;你觉得应该先做什么&#xff1f; 4、你在渗透测试过程中是如何敏感信息收集的&#xff1f; 5、你平时去哪些网站进行学习、挖漏洞提交到…

uni-app云打包(android)(自有证书、云端证书、公共测试证书)

一、进入云打包入口 发行->原生App-云打包 二、证书选择 1、使用自有证书 ①进入香蕉云编&#xff08;这里采用的证书从香蕉云编进行生成&#xff09; 香蕉云编-app打包上架工具类平台 ②进入页面选择“生成签名证书”->"立即创建证书" ③选择“安卓证书生…

java商城系统和php商城系统有什么差异?如何选择?

java商城系统和php商城系统是两种常见的电子商务平台&#xff0c;它们都具有一定的优势和劣势。那么&#xff0c;java商城系统和php商城系统又有哪些差异呢&#xff1f; 一、开发难度 Java商城系统和PHP商城系统在开发难度方面存在一定的差异。Java商城系统需要使用Java语言进…

微服务模式:业务服务模式

无论是单体应用还是微服务&#xff0c;构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中&#xff0c;都包含服务、实体、仓库等类。然而&#xff0c;也会发现一些明显的区别。在本文中&#xff0c;我将试图以概念性的方式强调这些区别&#xff0c…

opencv-24 图像几何变换03-仿射-cv2.warpAffine()

什么是仿射&#xff1f; 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后&#xff0c;直线仍然是直线&#xff1b;平行性是指 图像在完成仿射变换后&#xff0c;平行线仍然是平行线。…

深入解析Linux进程内存:VSS、RSS、PSS、USS及查看方式

VSS 虚拟耗用内存大小&#xff0c;是进程可以访问的所有虚拟内存的总量&#xff0c;包括进程独自占用的物理内存、和其他进程共享的内存、分配但未使用的内存。 RSS 驻留内存大小&#xff0c;是进程当前实际占用的物理内存大小&#xff0c;包括进程独自占用的物理内存、和其…

C#实现滑动拼图验证码

开发环境&#xff1a;C#&#xff0c;VS2019&#xff0c;.NET Core 3.1&#xff0c;ASP.NET Core 1、建立一个验证码控制器 新建两个方法Create和Check&#xff0c;Create用于创建验证码&#xff08;返回2张图片和令牌&#xff09;&#xff0c;Check用于验证&#xff08;验证图…

【iOS】KVC KVO 总结

文章目录 KVC1. KVC赋值原理 setValue:forKey:2. KVC取值原理 valueForKey:3. 注意4. KVC的批量存值和取值 KVO 使用1. KVO的介绍2. KVO监听的步骤注册监听监听实现移除监听例子 3. KVO的传值4. KVO注意5. KVO的使用场景 KVO原理1. KVO的本质是改变了setter方法的调用2. _NSSet…

Glow: Generative Flow with Invertible 1×1 Convolutions论文解析及实现(二)

Glow: Generative Flow with Invertible 11 Convolutions 代码github: https://github.com/rosinality/glow-pytorch添加链接描述 1 模型架构如下 1.1 左边图flow模型 Flow model ① ActNorm ② InvConv2dLU ③ AffineCoupling 1.2 右边模型结构Glow模型 Glow Model Block…

【Linux】-进程概念及进程状态(僵尸进程和孤儿进程)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

更安全,更省心丨DolphinDB 数据库权限管理系统使用指南

在数据库产品使用过程中&#xff0c;为保证数据不被窃取、不遭破坏&#xff0c;我们需要通过用户权限来限制用户对数据库、数据表、视图等功能的操作范围&#xff0c;以保证数据库安全性。为此&#xff0c;DolphinDB 提供了具备以下主要功能的权限管理系统&#xff1a; 提供用户…

OpenMP

官方文档&#xff1a;OpenMP | LLNL HPC Tutorials OpenMP总览 统一内存访问&#xff1a;OpenMP、Pthreads 非统一内存访问&#xff1a;MPI OpenMP与Pthread OpenMP原理 串行区到达并行区后会派生多个线程&#xff0c;并行区代码执行完后进行线程合并&#xff0c;剩下主线程 编…

Linux - PostgreSQL 适用于9.x 以上的 tar.gz 源码安装与理解 - 报错集锦

这里写目录标题 序言主要内容bash 配置文件个人理解关于初始化 PostgreSQL 数据库的理解 启动方法检查服务器是否在PostgreSQL中运行关闭 postgresql 数据库方法参考链接 序言 PostgreSQL 9.x 以下版本笔者没用过&#xff0c;具体操作看参考链接&#xff0c;笔者就不记录重复操…

MODBUS-TCP转Ethernet IP 网关连接空压机 配置案例

本案例是工业现场应用捷米特JM-EIP-TCP的Ethernet/IP转Modbus-TCP网关连接欧姆龙PLC与空压机的配置案例。使用设备&#xff1a;欧姆龙PLC&#xff0c;捷米特JM-EIP-TCP网关&#xff0c; ETHERNET/IP 的电气连接 ETHERNET/IP 采用标准的 T568B 接法&#xff0c;支持直连和交叉接…

在centos 7系统docker上构建mysql 5.7

一、VM上已经安装centos 7.9&#xff0c;且已完成docker的构建 二、安装mysql5.7 安装镜像&#xff1a;[rootlocalhost lll]# docker pull mysql:5.7 查看镜像[rootlocalhost lll]# docker images 根据镜像id构建mysql容器&#xff0c;且分配端口号[rootlocalhost lll]# dock…

自定义view - 玩转字体变色

自定义View步骤&#xff1a; 1>&#xff1a;values__attrs.xml&#xff0c;定义自定义属性&#xff1b; 2>&#xff1a;在第三个构造方法中获取自定义属性&#xff1b; 3>&#xff1a;onMeasure【不是必须的】&#xff1b; 4>&#xff1a;onDraw&#xff1a;绘制代…

emacs打开git仓库下多个子工程的根目录问题解决案

emacs打开git仓库下多个子工程的根目录问题解决案 问题描述 如题所述&#xff0c;这个问题困扰我很久了&#xff0c;一直没搜到完整的解决方案。这次终于乘着空闲时间&#xff0c;研究了projectile.el源码找到了方案。 问题场景具体描述下: 我自己有一个私人git仓库&#x…

机器学习:GPT3

GPT3 模型过于巨大 GPT3是T5参数量的10倍&#xff01; 训练GPT3的代价是$12百万美元 Zero-shot Ability GPT3的思想是不是能拿掉Fine-tune 只需要给定few-shot或者zero-shot就能干相应的任务了。 few-shot learning&#xff08;no gradient descent&#xff09;&#…

(学习笔记)matplotlib.pyplot模块下基本画图函数的整理

matplotlib版本&#xff1a;3.7.1 python版本&#xff1a;3.10.12 基本函数 matplotlib版本&#xff1a;3.7.1python版本&#xff1a;3.10.12 1. plt.plot()函数1.1 plt.plot(x, y)1.2 plt.plot(x, y, **kwargs) 2. plt.xlable(), plt.ylable()3. plt.title()4. plt.show()5.p…