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

【Java】LinkedList模拟实现

目录

  • 整体框架
  • IMyLinkedList接口
  • IndexNotLegalException异常类
  • MyLinkedList类
    • 成员变量(节点信息)
    • addFirst(头插)
    • addLast(尾插)
    • 在指定位置插入数据
    • 判断是否存在
    • 移除第一个相等的节点
    • 移除所有相等的节点
    • 链表的长度
    • 打印链表
    • 释放回收链表

整体框架

在这里插入图片描述

IMyLinkedList接口

这个接口用来存放所有方法,之后用MyLinkedList来实现这个接口,重写里面的方法

public interface IMyLinkedList {//头插法public void addFirst(int data);//尾插法public void addLast(int data);//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data);//查找是否包含关键字key是否在单链表当中public boolean contains(int key);//删除第一次出现关键字为key的节点public void remove(int key);//删除所有值为key的节点public void removeAllKey(int key);//得到链表的长度public int size();//打印链表public void display();//释放链表public void clear();
}

IndexNotLegalException异常类

IndexNotLegalExceprion异常类用来判断index是否合法

public class IndexNotLegalException extends RuntimeException{public IndexNotLegalException() {}public IndexNotLegalException(String msg) {super(msg);}
}

MyLinkedList类

成员变量(节点信息)

static class ListNode {public int val;public ListNode prev;public ListNode next;public ListNode (int val){this.val = val;}}public ListNode head;public ListNode last;

addFirst(头插)

public void addFirst(int data) {ListNode newNode = new ListNode(data);if(head == null){head = last = newNode;}else{newNode.next = head;head.prev = newNode;head = newNode;}}

addLast(尾插)

public void addLast(int data) {ListNode newNode = new ListNode(data);if(head == null){head = last = newNode;}else{newNode.prev = last;last.next = newNode;last = newNode;}}

在指定位置插入数据

public void addIndex(int index, int data) {//判断index的合法性try{checkIndex(index);}catch(IndexNotLegalException e){e.printStackTrace();}if(index == 0){addFirst(data);return;}if(index == size()){addLast(data);return;}ListNode newNode = new ListNode(data);ListNode cur = head;while(index != 0){cur = cur.next;index--;}newNode.next = cur;newNode.prev = cur.prev;cur.prev.next = newNode;cur.prev = newNode;}private void checkIndex(int index){if(index<0 || index>size()){throw new IndexNotLegalException("Index不合法...");}}

判断是否存在

public boolean contains(int key) {ListNode cur = head;while(cur != null){if(cur.val == key){return true;}cur = cur.next;}return false;}

移除第一个相等的节点

public void remove(int key) {ListNode cur = head;if(head.val == key && head == last){head = last = null;return;}//如果删除的在head节点if(head.val == key){head = head.next;head.prev = null;return;}while(cur != null){if(cur.val == key){cur.prev.next = cur.next;if(cur.next == null){last = cur.prev;break;}cur.next.prev = cur.prev;}cur = cur.next;}}

移除所有相等的节点

public void removeAllKey(int key) {ListNode cur = head;if(head.val == key && head == last){head = last = null;return;}//如果删除的在head节点if(head.val == key){head = head.next;head.prev = null;}while(cur != null){if(cur.val == key){cur.prev.next = cur.next;if(cur.next == null){last = cur.prev;break;}cur.next.prev = cur.prev;}cur = cur.next;}}

链表的长度

 public int size() {int count = 0;ListNode cur = head;while (cur != null) {count++;cur = cur.next;}return count;}

打印链表

    public void display() {ListNode cur = head;while (cur != null) {System.out.print(cur.val + " ");cur = cur.next;}System.out.println();}

释放回收链表

public void clear() {ListNode cur = head;while(cur != null){ListNode curN = cur.next;cur.prev = null;cur.next = null;cur = curN;}}
http://www.lryc.cn/news/328411.html

相关文章:

  • ubuntu下mysql常用命令
  • 燃气官网安全运行监测系统-阀井燃气监测仪-旭华智能
  • vue 文件预览(docx、.xlsx、pdf)
  • 云架构(二) 大使模式
  • .NET Path类库的特殊方法
  • 【JVM】JVM常用性能调优参数详细介绍
  • React中的受控组件与非受控组件
  • uniapp实现u-datetime-picker时间选择器的默认日期定位,解决default-value不生效问题
  • react native 使用ScrollView实现下拉更新,上拉加载更多
  • vue2完结
  • 前端网页之间传递参数
  • 【常见面试题】Golang中,协程数最多可以开多少个?
  • RabbitMQ基础笔记
  • 大型项目管理神器:掌握yarn monorepo的安装和使用
  • 算法打卡day28|贪心算法篇02|Leetcode 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II
  • 2013年认证杯SPSSPRO杯数学建模A题(第一阶段)护岸框架全过程文档及程序
  • 【3】3道链表力扣题:删除链表中的节点、反转链表、判断一个链表是否有环
  • mongodb sharding分片模式的集群数据库,日志治理缺失导致写入数据库报错MongoWriteConcernException的问题总结(上)
  • 苹果Mac OS系统上安装brew
  • 应用侧渲染流程
  • 学生党开放式运动耳机怎么选?五款超高销量高性价比品牌推荐
  • 服务器中有g++,但是查询不到,Command ‘g++‘ not found
  • count(“0“),split() ,sys.stdin.readline() ,matrix.append, input().strip()
  • Flink on Kubernetes (flink-operator) 部署Flink
  • 代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
  • 常见数据库分类介绍及其适用场景
  • 周末总结(2024/03/30)
  • (75)爬楼梯
  • ttkbootstrap界面美化系列之Notebook(四)
  • MySQL8存储过程整合springboot