当前位置: 首页 > news >正文

LinkedList模拟实现

1.链表的头插

2.链表的尾插

3.在链表中任意位置前插入

4.查找链表中是否有某一个值val

5.删除第一次出现的值key

6.删除所有出现的值key

在实现链表的功能前,我们首先要明白链表是由每一个结点构成的,每一个结点其实就是一个类,是由val值域和next域构成的,所以我们要先构造一个结点类,即静态内部类

public LinkedList {//创建结点static class ListNode{//每个结点都有val值域和next结点域组成public int val;public ListNode next;public ListNode(int val) {this.val = val;}}}

让后我们手动创建一个链表,然后让每一个结点next指向下一个结点的

1.链表的头插

在进行头插的时候,我们需要判断这个链表是否为空,如果链表为空的话,那么链表的head就是要插入的新结点,这个需要我们注意

    public void addFirst(int val) {//申请新的结点ListNode newNode = new ListNode(val);//判断链表是否为空,如果链表为空,那么要插入的结点就是headif(head == null) {head = newNode;return;}//否则就进行头插newNode.next = head;head = newNode;}

2.链表的尾插

链表的尾插,只需要判断这个链表是否为空,如果为空,那么就相当于头插,如果不为空,那么就只需要我们找到链表的最后一个结点即可

    public void addLast(int val) {ListNode newNode = new ListNode(val);if(head == null) {head = newNode;return;}//如果链表不为空,那么就要找到最后一个结点//定义cur去查找最后一个结点,不要用head去找,不然找完后head就不指向第一个结点了ListNode cur = head;while(cur.next != null) {cur = cur.next;}cur.next = newNode;}

       

3.在链表中任意位置前插入

在任意位置插入的时候,如果插入的位置为0或者为size,那么就是头插或者尾插,插入前要判断插入的位置是否合法,如果插入的位置<0或者>size,那么插入失败,否则就要找到插入的结点的前一个结点

 public void addIndext(int pos, int val) {ListNode newNode = new ListNode(val);if(pos < 0 || pos > size()) {System.out.println("插入位置非法!!!,程序退出");return;}if(pos == 0) {//头插addFirst(val);return;} else if(pos == size()) {//尾插addLast(val);return;}//找到要插入的结点的前一个结点ListNode cur = head;for(int i = 1; i < pos; i++) {cur = cur.next;}//出了循环,cur就在要插入的结点的前面newNode.next = cur.next;cur.next = newNode;}

4.查找链表中是否有某一个值val

    public boolean contains(int key) {ListNode cur = head;while(cur != null) {if(cur.val == key) {System.out.println("查找成功");return true;}cur = cur.next;}System.out.println("查找失败");return false;}

5.删除第一次出现的值key

首先先判断链表是否为空,如果不为空,则先判断头结点是不是就是val,如果是,那么让头结点向后走即可,如果不是,那么遍历一次链表看是否能找到,如果找不到则说明这个链表没有这个val值

    public void remove(int key) {ListNode cur = head;//判断链表是否为空if(head == null) {System.out.println("链表为空,无此关键字");return;}if(cur.val == key) {head = head.next;return;}while(cur.next != null) {if(cur.next.val == key) {cur.next = cur.next.next;System.out.println("删除成功");return;}cur = cur.next;}System.out.println("此链表无此关键字key->" + key);}

6.删除所有出现的值key

public void removeAllKey(int key) {ListNode cur = head.next;ListNode prev = head;if(cur == null) {System.out.println("链表为空,程序退出");return;}while(cur != null) {if(cur.val == key) {prev.next = cur.next;cur = cur.next;}else {prev = prev.next;cur = cur.next;}}//最后判断一下头结点是否为val值if(head.val == key) {head = head.next;}}

总结:

在创建链表的时候,我们要清楚链表是由一个个结点构成的,而每一个结点都是由val域和next域构成,所以我们可以将结点看成一个类,然后在模拟实现方法的时候,我们都要先判断这个链表是否为空,而顺序表是判断是否为满。

http://www.dtcms.com/a/405922.html

相关文章:

  • 如何自己做淘宝网站网页设计策划
  • 神奇的位运算——力扣136.只出现一次的数字
  • 【征文计划】深度剖析 Rokid SLAM 算法:从传感器融合到空间重建的完整技术链路
  • Pygame中实现图像旋转效果-高级2-2
  • 高新苏州网站建设wordpress首页等待画面
  • 两学一做知识问答网站施工企业招标领导小组组长的职责
  • Spring AI:RAG函数调用
  • 基于Amazon S3设置AWS Transfer Family Web 应用程序
  • 稳石氢能出席AEM电解水学术与产业化论坛,大标方AEM制氢设备批量化生产荣获技术卓越奖。
  • 渲染 Python 中用 LaTeX 语法定义的数学公式 - 例子
  • 菊风金融智能双录:为金融业务合规与信任保驾护航
  • Debian安装PVE
  • 云计算实验2——CentOS中zookeeper的安装
  • 网络管理实验1:ASN.1软件应用
  • 前端开发用什么工具?前端开发工具推荐清单、实用对比与我的使用心得
  • 做亚马逊有什么网站可以借鉴大连城市建设档案馆官方网站
  • 协议不通,数据何通?耐达讯自动化Modbus TCP与Profibus网关技术破解建筑自动化最大瓶颈
  • 新零售模式下仓储变化与发展趋势
  • Stable Video Diffusion:将潜在视频扩散模型扩展到大规模数据集——论文阅读
  • [linux仓库]解剖ELF:从文件头到进程地址空间的完美映射
  • Lisp 与 C# 交互中,类型码(TypeCode)的映射关系
  • Java基础(十四):枚举类详解
  • python+springboot+uniapp基于微信小程序的任务打卡系统
  • 【多线程】计算机领域中的各种锁
  • python+uniapp基于微信小程序的医院陪诊预约系统
  • 免费html网页模板 html5网站模板 静态网页模板
  • 网站怎么做区域性优化公司网站建设会计上怎么处理
  • 专业商城网站建设价格定制家具网
  • ABCTorrents官网入口 – 磁力搜索引擎网站
  • python+django/flask+uniapp基于微信小程序的瑜伽体验课预约系统