java数据结构与算法:双链表 LinkedList

双链表 LinkedList

实现代码

package com.lhs;public class LinkedList<E> implements List<E>{// 定义链表长度private int size;// 定义头节点private Node<E> first;// 定义尾节点private Node<E> last;// 内部类,定义节点public static class Node<E>{// 定义节点数据E data;// 定义下一个节点Node<E> next;// 定义前一个节点Node<E> pre;// 构造函数,用于创建新的节点Node(E data,Node<E> next,Node<E> pre){this.data = data;this.next = next;this.pre = pre;}}// 重写size方法,返回链表长度@Overridepublic int size() {return size;}// 重写isEmpty方法,判断链表是否为空@Overridepublic boolean isEmpty() {return size == 0;}// 重写contains方法,判断链表是否包含某元素@Overridepublic boolean contains(Object o) {return IndexOf(o) >= 0;}// 重写IndexOf方法,返回某元素在链表中的位置public int IndexOf(Object o){Node<E> node = first;if (o == null){for (int i = 0; i < size; i++) {if (node.data == null){return i;}node = node.next;}return -1;}else{for (int i = 0; i < size; i++) {if (o.equals(node.data)){return i;}node = node.next;}return -1;}}// 重写add方法,向链表末尾添加元素@Overridepublic boolean add(E e) {if (size == 0){Node<E> node = new Node<>(e, null, null);first = node;last = node;}else{Node<E> l = last;Node<E> node = new Node<>(e, null, l);l.next = node;last = node;}size++;return true;}// 重写get方法,返回链表中指定位置的元素@Overridepublic E get(int index) {if(index >= size){throw new IndexOutOfBoundsException(index + " out of bound");}Node<E> node;if(index > (size >> 1)){node = last;for(int i = 0 ; i<size - index - 1;i++){node = node.pre;}}else{node = first;for (int i = 0; i < size - index - 1; i++) {node = node.next;}}return node.data;}// 重写set方法,替换链表中指定位置的元素@Overridepublic E set(int index, E e) {if(index >= size){throw new IndexOutOfBoundsException(index + " out of bound");}E oldVal;Node<E> node;if(index > (size >> 1)){node = last;for(int i = 0 ; i<size - index - 1;i++){node = node.pre;}}else{node = first;for (int i = 0; i < size - index - 1; i++) {node = node.next;}}oldVal = node.data;node .data = e;return oldVal;}// 重写remove方法,移除链表中指定位置的元素@Overridepublic E remove(int index) {if(index >= size){throw new IndexOutOfBoundsException(index + " out of bound");}Node<E> node;if(index > (size >> 1)){node = last;for(int i = 0 ; i<size - index - 1;i++){node = node.pre;}}else{node = first;for (int i = 0; i < size - index - 1; i++) {node = node.next;}}E oldVal = node.data;Node<E> n = node.next;Node<E> p = node.pre;if(p != null){p.next = n;}else{first = n;}if(n != null){n.pre = p;}else{last = p;}size--;return oldVal;}// 重写addFirst方法,向链表头部添加元素@Overridepublic void addFirst(E e) {Node<E> f = first;Node<E> node = new Node<>(e, null, f);f.pre = node;first = node;size++;}// 重写addLast方法,向链表尾部添加元素@Overridepublic void addLast(E e) {add(e);}// 重写removeFirst方法,移除链表头部元素@Overridepublic E removeFirst() {return remove(0);}// 重写removeLast方法,移除链表尾部元素@Overridepublic E removeLast() {return remove(size-1);}
}

测试代码

/*** Welcome to https://waylau.com*/
package com.lhs;import org.junit.Test;import java.util.LinkedList;
import java.util.List;import static junit.framework.TestCase.*;
import static org.junit.Assert.assertThrows;/*** LinkedList Test.* * @since 1.0.0 2020年5月4日* @author <a href="https://waylau.com">Way Lau</a>*/
public class LinkedListTests {@Testpublic void testSize() {// 实例化LinkedListList<String> list = new LinkedList<String>();assertTrue(list.size() == 0);list.add("Java");assertTrue(list.size() == 1);}@Testpublic void testIsEmpty() {// 实例化LinkedListList<String> list = new LinkedList<String>();assertTrue(list.isEmpty());list.add("Java");assertFalse(list.isEmpty());}@Testpublic void testContains() {// 实例化LinkedListList<String> list = new LinkedList<String>();list.add("Java");list.add("C++");list.add("C");list.add("Python");list.add("TypeScript");// 判断存在assertTrue(list.contains("Java"));// 判断不存在assertFalse(list.contains("Java++"));}@Testpublic void testAdd() {// 实例化LinkedListList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);assertFalse(list.isEmpty());}@Testpublic void testGet() {// 实例化LinkedListList<String> list = new LinkedList<String>();list.add("Java");list.add("C++");list.add("C");// 判断存在assertEquals("C++", list.get(1));// 判断不存在int index = 6;Throwable excpetion = assertThrows(IndexOutOfBoundsException.class, () -> {list.get(index);// 抛异常});assertNotNull(excpetion.getMessage());}@Testpublic void testSet() {// 实例化LinkedListList<String> list = new LinkedList<String>();list.add("Java");list.add("C++");list.add("C");// 判断存在assertEquals("C", list.set(2, "Python"));// 判断不存在int index = 6;Throwable excpetion = assertThrows(IndexOutOfBoundsException.class, () -> {list.set(index, "Python");// 抛异常});assertNotNull(excpetion.getMessage());}@Testpublic void testRemove() {// 实例化LinkedListList<String> list = new LinkedList<String>();list.add("Java");list.add("C++");list.add("C");// 判断存在assertEquals("C", list.remove(2));assertEquals("C++", list.remove(1));assertEquals("Java", list.get(0));// 判断不存在int index = 6;Throwable excpetion = assertThrows(IndexOutOfBoundsException.class, () -> {list.remove(index); // 抛异常});assertNotNull(excpetion.getMessage());}@Testpublic void testAddFirst() {// 实例化LinkedListLinkedList<String> list = new LinkedList<String>();list.addFirst("Java");list.addFirst("C++");list.addFirst("C");// 判断存在assertEquals("C", list.get(0));assertEquals("C++", list.get(1));assertEquals("Java", list.get(2));}@Testpublic void testAddLast() {// 实例化LinkedListLinkedList<String> list = new LinkedList<String>();list.addLast("Java");list.addLast("C++");list.addLast("C");// 判断存在assertEquals("Java", list.get(0));assertEquals("C++", list.get(1));assertEquals("C", list.get(2));}@Testpublic void testRemoveFirst() {// 实例化LinkedListLinkedList<String> list = new LinkedList<String>();list.add("Java");list.add("C++");list.add("C");// 判断存在assertEquals("Java", list.removeFirst());assertEquals("C++", list.removeFirst());assertEquals("C", list.removeFirst());}@Testpublic void testRemoveLast() {// 实例化LinkedListLinkedList<String> list = new LinkedList<String>();list.add("Java");list.add("C++");list.add("C");// 判断存在assertEquals("C", list.removeLast());assertEquals("C++", list.removeLast());assertEquals("Java", list.removeLast());}}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568平台 温度传感器芯片SD5075

一.SD5075芯片简介 SD5075 是一款高准确度温度传感器芯片内含高精度测温 ADC&#xff0c;在-40C ~100C 范围内典型误差小于0.5C&#xff0c;在-55C~125C 范围内典型误差小于士1.0C。通过两线 IC/SMBus接口可以很方便与其他设备建立通信。设置 A2~A0 的地址线&#xff0c;可支持…

玩转 openEuler (一)-- 系统安装

简介 openEuler 是一款开源操作系统。当前 openEuler 内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、人工智能等…

电子电器架构车载软件 —— 集中化架构软件开发

电子电器架构车载软件 —— 集中化架构软件开发 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任…

汽车ECU的虚拟化技术初探(四)--U2A内存管理

目录 1.内存管理概述 2. 内存保护功能 2.1 SPID 2.2 Slave Guard 3.小结 1.内存管理概述 为了讲清楚U2A 在各种运行模式、特权模式下的区别&#xff0c;其实首先应该搞清楚不同模式下可以操作的寄存器有哪些。 但是看到这个寄存器模型就头大。 再加上之前没有研究过G4MH…

文件操作(二)

͟͟͞͞&#x1f3c0;前言上一篇我们加们讲了什么是文件&#xff0c;为什么使用文件&#xff0c;以及流的概念。我们继续接上一篇来继续讲解我们的文件操作&#xff0c;这一篇将会详细的讲如何对文件进行读写。 目录 &#x1f680;一.文件的顺序读写 1.fgetc和fputc 2.fget…

【OJ】环形链表

目录 1. 环形链表||&#xff08;142&#xff09;1.1 题目描述1.2 题目分析1.3 代码 2. 环形链表&#xff08;141&#xff09;2.1 题目描述2.2 题目分析2.3 代码 1. 环形链表||&#xff08;142&#xff09; 1.1 题目描述 1.2 题目分析 带环链表&#xff1a;尾节点的next指向链…

Python异步网络编程库之twisted 详解

概要 Python twisted 是一个强大的异步网络编程框架&#xff0c;它允许开发者轻松构建高性能的网络应用和协议。无论是构建网络服务器、客户端、聊天应用还是实时通信工具&#xff0c;twisted 都提供了丰富的工具和组件。本文将深入探讨 twisted 的基本概念、安装方法以及详细…

sql | 学生参加各科考试次数

学生表: Students------------------------ | Column Name | Type | ------------------------ | student_id | int | | student_name | varchar | ------------------------ 在 SQL 中&#xff0c;主键为 student_id&#xff08;学生ID&#xff09;。 该表内的每…

多机TCP通讯之hello world(C++)

文章目录 TCP是什么准备工作CMakeLists.txt服务端代码客户端代码参考 TCP是什么 TCP&#xff08;传输控制协议&#xff09;是一种在计算机网络中广泛使用的协议&#xff0c;它提供了可靠的、面向连接的数据传输服务。TCP 是 OSI 模型中的传输层协议&#xff0c;它确保了数据的…

[NAND Flash 6.4] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​全文 6000 字 内容摘要 NAND Flash 引脚功能 读操作步骤 NAND Flash中的特殊硬件结构 NAND Flash 读写时的数据流向 Read 操作时序 读时序操作过…

第 11 章 树结构实际应用

文章目录 11.1 堆排序11.1.1 堆排序基本介绍11.1.2 堆排序基本思想11.1.3 堆排序步骤图解说明11.1.4 堆排序代码实现 11.2 赫夫曼树11.2.1 基本介绍11.2.2 赫夫曼树几个重要概念和举例说明11.2.3 赫夫曼树创建思路图解11.2.4 赫夫曼树的代码实现 11.3 赫夫曼编码11.3.1 基本介绍…

【NI国产替代】USB‑7846 Kintex-7 160T FPGA,500 kS/s多功能可重配置I/O设备

Kintex-7 160T FPGA&#xff0c;500 kS/s多功能可重配置I/O设备 USB‑7846具有用户可编程FPGA&#xff0c;可用于高性能板载处理和对I/O信号进行直接控制&#xff0c;以确保系统定时和同步的完全灵活性。 您可以使用LabVIEW FPGA模块自定义这些设备&#xff0c;开发需要精确定时…

【GitHub项目推荐--13 个 Python 学习资源】【转载】

近些年&#xff0c;人工智能应用铺天盖地。人脸识别、老照片复活、换脸等应用都得益于人工智能算法。 许多人工智能算法封装的框架基于 Python 语言&#xff0c;这也导致了 Python 的热度只增不减。 Python 简单易学&#xff0c;根据 2020 年 StackOverflow 开发者调查报告显…

智能路由器中的 dns.he.net可使用自定义域名的免费 DDNS 服务配置方法

今天介绍的这个是可以使用自定义域名同时支持使用二级域名的免费DDNS服务 dns.he.net的动态DDNS服务的配置方法, 这个服务相对还是比较稳定的, 其配置也和其他的DDNS服务有些不太一样, 首先他的主机名: 这里需要设置为登录后分配的区域域名: ipv6.he.net 然后就是 DDNS 用户…

让一个元素水平居中的方式有哪些

今天总结一下我所遇到过的 让一个元素水平居中的方式 <!--* Author: HuKang* Date: 2023-09-19 11:07:44* LastEditTime: 2023-12-22 22:52:38* LastEditors: HuKang* Description: * FilePath: \route-planning\tempDemo.html --> <!DOCTYPE html> <html>…

案例:新闻数据加载

文章目录 介绍相关概念相关权限约束与限制完整示例 代码结构解读构建主界面数据请求下拉刷新总结 介绍 本篇Codelab是基于ArkTS的声明式开发范式实现的样例&#xff0c;主要介绍了数据请求和touch事件的使用。包含以下功能&#xff1a; 数据请求。列表下拉刷新。列表上拉加载…

Express 应用生成器(脚手架)的安装与使用

1、简介 自动生成一个express搭建的项目结构 官网&#xff1a;Express 应用生成器 2&#xff0c;使用 2.1全局安装&#xff0c;使用管理员打开命令窗口 2.2、安装express # 全局安装express npm install -g express # 全局安装express脚手架 npm install -g express-gene…

Socket编程-IO模型

1、首先IO模型的内容。 感觉可以简单理解为&#xff1a;我们写代码时&#xff0c;在基础的 IO 操作上做了一些其他的策略&#xff0c;根据策略的不同&#xff0c;一般有阻塞IO和非阻塞IO 1、阻塞IO 就是在操作的时候&#xff0c;比如网络通信中&#xff0c;某一线程使用下面这…

最大公约数和最小公倍数

1. 最大公约数 给定两个整数&#xff0c;求这两个数的最大公约数 暴力求解&#xff1a; 从较小的那个数开始&#xff0c;依次递减&#xff0c;直到某个数能够同时被整除 //暴力求解 int main() {int a 0;int b 0;scanf("%d %d", &a, &b);int i 0;int min …

代码随想录 Leetcode142. 环形链表 II

题目&#xff1a; 代码(首刷看解析 2024年1月13日&#xff09;&#xff1a; class Solution { public:ListNode *detectCycle(ListNode *head) {if (head nullptr) return nullptr;ListNode* fast head;ListNode* slow head;while (true) {if(fast->next nullptr || fa…