LinkedList与链表

目录

一、链表

链表相关练习题

二、LikedList

1、构造方法

2、常用方法 

3、LinkedList的遍历

4、ArrayList与LinkedList的区别

一、链表

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的

  • 链式结构在逻辑上是连续的,但是在物理上不一定连续
  • 现实中的结点一般是从堆上申请出来的
  • 从堆上申请的空间是按照一定的策略来分配的,两次申请的空间可能连续也可能不连续 

链表的结构多种多样,就单向/双向、有无头结点、是否循环3种情况组合起来 就有8种链表结构,我们重点掌握两种:

  • 无头单向非循环链表:结构简单,一般不会单独用于存储数据,而是作为其他数据结构的子结构,如哈希桶、图的邻接表等
  • 无头双向非循环链表:Java的集合框架中LinkedList底层实现
链表相关练习题
  1. 删除链表中等于给定值val的所有结点
  2. 反转单链表(头插法)
  3. 给定单链表头结点返回中间结点,若有2个则返回第2个(快慢指针)
  4. 输出单链表倒数第K个结点(差值)
public ListNode FindKthToTail(int k){if(k<0 || k>size) return null;ListNode slow=head;ListNode fast=head;for(int i=0;i<k-1;i++){fast=fast.next;if(fast==null) return null;}while(fast!=null){fast=fast.next;slow=slow.next;}return slow;
}

5、合并两个有序链表(串珠子)

class Solution {public ListNode mergeTwoLists(ListNode headA, ListNode headB) {ListNode newHead=new ListNode();ListNode tmpHead=newHead;while(headA!=null && headB!=null){if(headA.val>headB.val){tmpHead.next=headB;headB=headB.next;}else{tmpHead.next=headA;headA=headA.next;}tmpHead=tmpHead.next;}if(headA!=null){tmpHead.next=headA;}if(headB!=null){tmpHead.next=headB;}return newHead.next;}
}

6、以给定值为基准,所有小于此值的排在大于或等于此值之前(分割合并)

public class Partition {public ListNode partition(ListNode pHead, int x) {ListNode bs=null;ListNode be=null;ListNode as=null;ListNode ae=null;ListNode cur=pHead;while(cur!=null){if(cur.val<x){if(bs==null) {bs=be=cur;}else{be.next=cur;be=be.next;}}else{if(as==null) {as=ae=cur;}else{ae.next=cur;ae=ae.next;}}cur=cur.next;}if(bs==null)return as;be.next=as;if(as!=null){ae.next=null;}return bs;}
}

7、判断是否为回文结构 (快慢指针、翻转链表)

 public boolean chkPalindrome(ListNode head) {//1、找到中间链表结点ListNode slow=head;ListNode fast=head;while(fast!=null && fast.next!=null){fast=fast.next.next;slow=slow.next;}//2、翻转中间结点以后的链表ListNode cur=slow.next;while(cur!=null){ListNode curNext=cur.next;cur.next=slow;slow=cur;cur=curNext;}//3、从前从后比较while(head != slow){if(head.val != slow.val){return false;}if(head.next==slow){//偶数个元素走交叉了return true;}head=head.next;slow=slow.next;}return true;
}

 8、输入两个链表找出它们第一个公共结点(双指针、差值)

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//1、求2个链表长度的差值int lenA=0,lenB=0;ListNode pL=headA;ListNode pS=headB;while(pL!=null){lenA++;pL=pL.next;}while(pS!=null){lenB++;pS=pS.next;}int len=lenA-lenB;pL=headA;pS=headB;if(len<0){len=lenB-lenA;pL=headB;pS=headA;}//2、让pL先走len步,后两个链表同时走while(len>0){pL=pL.next;len--;}while(pL!=null && pS!=null){if(pS==pL){return pL;}pL=pL.next;pS=pS.next;}return null;}

9、判断给定单链表中是否有环

public boolean hasCycle(ListNode head) {if(head==null) return false;ListNode fast=head,slow=head;while(fast!=null && fast.next!=null){fast=fast.next.next;slow=slow.next;if(fast==slow){return true;}}return false;     
}

10、返回给定链表开始入环的第一个结点(快慢指针法)

两指针相遇时路程fast=L+nC+(C-y);slow=L+C-y
则L+nC+(C-y)=2L+2C-2y
    L=nC+C-y-2C+2y=(n-1)C+y
即头节点到入环点的距离=绕几圈再走到相遇点的距离
那我们让a指针头节点开始走,b指针从相遇点开始走饶了好几圈之后再走y距离就能和a指针相遇,相遇点就为入环点

public ListNode detectCycle(ListNode head) {if(head==null) return null;ListNode fast=head,slow=head;while(fast!=null && fast.next!=null){fast=fast.next.next;slow=slow.next;if(fast==slow)//二者相遇break;}//是因为无环才跳出循环if(fast==null || fast.next==null)//因循环条件不满足而跳出循环return null;//有环,因为快慢指针相遇才跳出循环,此时就让一指针从head出发,另一指针从相遇点出发,两者相遇点即为入环点fast=head;while(fast!=slow){fast=fast.next;slow=slow.next;}return fast;
}

二、LikedList

LinkedList的底层是无头双向非循环链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的结点中,然后通过引用将结点连接起来 ,因此在任意位置插入或删除元素时不需要搬运元素,效率比较高,时间复杂度为O(1)

1、构造方法
LinkedList()无参构造
LinkedList(Collection<? extends E> c)使用其他容器中元素构造List
2、常用方法 
方法
解释
boolean add (E e)
尾插 e
void add (int index, E element)
e 插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插 c 中的元素
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
E remove(int index)删除 index 位置元素
boolean contains(Object o)判断 o 是否在线性表中
int indexOf(Object o)返回第一个 o 所在下标
int lastIndexOf(Object o)返回最后一个 o 的下标
boolean remove(Object o)删除遇到的第一个 o
List<E> subList(int fromIndex, int toIndex)截取部分 list
void clear()清空
3、LinkedList的遍历
public static void main(String[] args) {LinkedList<Integer> list=new LinkedList<>();for (int i = 1; i < 6; i++) {list.add(i);//尾插}System.out.println(list.get(0));//1、foreach遍历for (int e: list)System.out.print(e+" ");System.out.println();//2、迭代器正向遍历ListIterator<Integer> it=list.listIterator();while (it.hasNext())System.out.print(it.next()+" ");System.out.println();//3、迭代器反向遍历ListIterator<Integer> rit=list.listIterator(list.size());while (rit.hasPrevious())System.out.print(rit.previous()+" ");
}
4、ArrayList与LinkedList的区别
不同点ArrayListLinkedList
存储空间上物理上一定连续逻辑上连续,物理上不一定
随机访问支持:O(1)不支持:O(N)
头插需要搬运元素,效率低:O(N)只需要修改引用的方向:O(1)
插入空间不够时需要扩容没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vulnhub靶机hackxor提示(部分写出)

靶机地址&#xff1a;Hackxor: 1 ~ VulnHub 主机发现 130是靶机 端口扫描 服务扫描 漏洞扫描 Hosts配置&#xff08;这个是需要在网上找的&#xff0c;这个是靶机的缘故搭建不完全所以需要自己写hosts&#xff09; 访问wraithmail:8080 数据包 GET http://utrack/cat.jsp?id1…

录的视频怎么消除杂音?从录制到后期的杂音消除攻略

在录制视频时&#xff0c;杂音往往是一个令人头疼的问题。无论是环境噪音、设备噪音还是电磁干扰&#xff0c;杂音的存在都会极大地影响视频的听觉体验。录的视频怎么消除杂音&#xff1f;通过一些前期准备和后期处理技巧&#xff0c;我们可以有效地消除这些杂音&#xff0c;提…

C++内存模型与并发支持

本文是CppCon23演讲&#xff1a;C Memory Model&#xff1a;from C11 to C 23的笔记&#xff0c;掺杂个人见解以及扩展 内存模型 操作系统的四个特性&#xff1a;虚拟&#xff0c;并发&#xff0c;持久 抽象中很重要的一部分就是内存虚拟。从编程的角度来看&#xff0c;编程就…

机器学习day5-随机森林和线性代数1

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

jdk1.7的hashmap为什么会出现死循环问题

原因在于链表结构出现了环状。为什么会出现环状的链表&#xff1f; 原因在于多个线程同时进行扩容的时候。 由于一个线程使用的是头插法进行迁移数据到新开辟的数组中&#xff0c;使得链表中的数据是颠倒的顺序。 而当另一个线程扩容的时候就可能因为这个颠倒的顺序而出现指针…

微信小程序navigateTo:fail webview count limit exceed

theme: nico 你们好&#xff0c;我是金金金。 场景 uniapp编写微信小程序&#xff0c;使用uni.navigateTo跳转的过程中报错如下&#xff1a; 报错意思也非常明显了&#xff1a;errMsg":"navigateTo:fail webview 数量超出限制 排查 排查之前我先贴一下代码 代码非…

逆向攻防世界CTF系列33-流浪者

逆向攻防世界CTF系列33-流浪者 shiftf12看到pass&#xff0c;跟进 是个输入的处理&#xff0c;其实很简单&#xff0c;看不懂也没关系&#xff0c;先看看return 这里strcmp成功后return的就是成功 最后要为KanXueCTF2019JustForhappy while ( *(_DWORD *)(a1 4 * v4) < 0x…

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数&#xff0c;初始化节点对象&#xff0c;包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点&#xff0c;默认为None self.rig…

Ubuntu22.04.2 k8s部署

k8s介绍 简单介绍 通俗易懂的解释&#xff1a; Kubernetes&#xff08;也被称为 K8s&#xff09;就像是一个大管家&#xff0c;帮你管理你的云计算服务。想象一下&#xff0c;你有很多个小程序&#xff08;我们称之为“容器”&#xff09;&#xff0c;每个都在做不同的事情&…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西&#xff0c;主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数&#xff08;或 alloca&#xff09;分配的是栈内存&#xff0c;它的特点是&#xff1a; 生命周…

Linux-软件管理-本地仓库和网络资源仓库配置(RHCSA)

该章节的目录如下&#xff1a; 认识rpm包 将设备挂载到/mnt上面 查看光驱上的相关信息 使用rpm包管理软件 仓库的配置(重要) 无相关文件 本地仓库配置&#xff08;书写相关的仓库文件&#xff09; 配置流程 效果测试&#xff08;安装卸载&#xff09; 查看仓库 清理…

【arxiv‘24】Vision-Language Navigation with Continual Learning

论文信息 题目&#xff1a;Vision-Language Navigation with Continual Learning 视觉-语言导航与持续学习 作者&#xff1a;Zhiyuan Li, Yanfeng Lv, Ziqin Tu, Di Shang, Hong Qiao 论文创新点 VLNCL范式&#xff1a;这是一个新颖的框架&#xff0c;它使得智能体能够在适…

数字化建设:指标如何驱动的企业KPI设计?

我们以KPI设定为例&#xff0c;简单说明在一套科学的经营分析体系的加持下&#xff0c;企业的经营KPI应该如何设定&#xff0c;如图所示。 指标驱动的企业KPI设计 每年年初企业做战略规划的同时&#xff0c;会启动年度业务KPI的设定。这个时候经营分析团队会主导整个过程。首先…

初级数据结构——栈题库(c++)

目录 前言1.杭电oj——Bitset2.杭电oj——进制转换[3.力扣——LCR 123. 图书整理 I](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/description/)[4.力扣——LCR 027. 回文链表](https://leetcode.cn/problems/aMhZSa/)[5.力扣——1614. 括号的最大嵌…

数字化转型企业架构设计手册(交付版),企业数字化转型建设思路、本质、数字化架构、数字化规划蓝图(PPT原件获取)

1、企业架构现状分析 2、企业架构内容框架 3、企业架构设计方法 3.1 、业务架构设计方法 3.2 、数据架构设计方法 3.3 、应用架构设计方法 3.4 、技术架构设计方法 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

鸿蒙NEXT自定义组件:太极Loading

【引言】&#xff08;完整代码在最后面&#xff09; 本文将介绍如何在鸿蒙NEXT中创建一个自定义的“太极Loading”组件&#xff0c;为你的应用增添独特的视觉效果。 【环境准备】 电脑系统&#xff1a;windows 10 开发工具&#xff1a;DevEco Studio NEXT Beta1 Build Vers…

AVL树了解并简单实现

这篇文章默认知道二叉搜索树&#xff0c;如果了解并不多可以先看看二叉搜索树了解和实现-CSDN博客 目录 1.AVL树概念 2.AVL树节点定义 3.AVL树的插入&#xff08;重点&#xff09; 3.1AVL树 3.2AVL树的旋转 3.3AVL树插入代码 4.AVL树的验证 5.AVL树的删除 6.AVL树的性能…

【MySQL】索引原理及操作

目录 索引原理 初识索引 磁盘原理 磁盘与系统之间的关系 MySQL、系统、磁盘之间的关系 理解索引 页目录 页目录设计的数据结构问题 聚簇索引与非聚簇索引 遗留问题 索引操作 创建索引 查询索引 删除索引 其他索引概念与操作 索引原理 索引&#xff08;I…

代码随想录算法训练营第三十一天| 56. 合并区间 、738.单调递增的数字 。c++转java

56. 合并区间 class Solution {public int[][] merge(int[][] intervals) {//对区间按照右边界排序Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));List<int[]> p new LinkedList<>();int l intervals[0][0],r intervals[0][1];for(int i 1;i…