数据结构_双向循环链表实战

ops/2024/12/22 0:37:51/

链表实战">双向循环链表实战

image-20241217162234557

package XHLB;public class SXXHLB {// 定义双向链表节点static class DoubleListNode { //Node(节点)private int val;private DoubleListNode prev;private DoubleListNode next;public DoubleListNode(int val) {this.val = val;this.next = null;this.prev = null;}}// 封装函数static class SXLB {private DoubleListNode head;private DoubleListNode tail;// 构造函数,初始化空链表public SXLB() {this.head = null;this.tail = null;}// 判断链表是否为空public boolean isEmpty() {return this.head == null;}//在第i个位置添加元素Xpublic void append(int i, int val) {DoubleListNode newNode = new DoubleListNode(val);// 如果链表为空,头节点尾节点都是我,并且将前指针域和后指针域都指向我if (this.head == null) {this.head = newNode;this.tail = newNode;newNode.next = newNode;newNode.prev = newNode;return;}// 如果 i == 0,表示在头部插入//第一步:先处理循环链表(2)//第二步:再处理原来的头节点//第三步:更新头节点if (i == 0) {newNode.next = this.head;newNode.prev = this.tail;this.head.prev = newNode;this.tail.next = newNode;this.head = newNode;return;}// 遍历链表,找到第 i-1 个节点DoubleListNode current = this.head;int count = 0;while (count < i - 1 && current.next != this.head) {current = current.next;count++;}// 如果 i 超出链表长度,插入到链表尾部if (count < i - 1) {newNode.prev = this.tail;newNode.next = this.head;this.tail.next = newNode;this.head.prev = newNode;this.tail = newNode;return;}// 在第 i-1 个节点和第 i 个节点之间插入新节点//第一步:先将元素插入(2)//第二步:处理附近元素newNode.prev = current;newNode.next = current.next;current.next.prev = newNode;current.next = newNode;// 如果插入位置是尾部,更新 tailif (newNode.next == this.head) {this.tail = newNode;}}// 从前往后遍历(双向循环链表)public void qianprint() {if (this.head == null) {return; // 空链表}DoubleListNode current = this.head;do {System.out.print(current.val + "\t");current = current.next;} while (current != this.head); // 循环直到回到头节点System.out.println();}// 从后往前遍历(双向循环链表)public void hoprint() {if (this.tail == null) {return; // 空链表}DoubleListNode current = this.tail;do {System.out.print(current.val + "\t");current = current.prev;} while (current != this.tail); // 循环直到回到尾节点System.out.println();}// 删除节点(双向循环链表)public void delete(int i) {if (this.head == null) {return; // 空链表}DoubleListNode current = this.head;int count = 0;// 遍历链表,找到第 i 个节点while (count < i && current.next != this.head) {current = current.next;count++;}// 如果 i 超出链表长度,直接返回if (count < i) {return;}// 如果链表只有一个节点if (current == this.head && current == this.tail) {this.head = null;this.tail = null;return;}// 如果删除的是头节点if (current == this.head) {this.head = current.next;this.head.prev = this.tail;this.tail.next = this.head;}// 如果删除的是尾节点else if (current == this.tail) {this.tail = current.prev;this.tail.next = this.head;this.head.prev = this.tail;}// 如果删除的是中间节点else {current.prev.next = current.next;current.next.prev = current.prev;}}// 取第 i 个位置上的元素(双向循环链表)public int getElement(int index) {if (this.head == null) {throw new IndexOutOfBoundsException("Index out of range");}DoubleListNode current = this.head;int count = 0;do {if (count == index) {return current.val;}count++;current = current.next;} while (current != this.head); // 循环直到回到头节点throw new IndexOutOfBoundsException("Index out of range");}// 返回元素 x 第一次出现在双向循环链表中的位置号public int firstappear(int x) {if (this.head == null) {return -1; // 空链表}DoubleListNode current = this.head;int index = 0;do {if (current.val == x) {return index;}index++;current = current.next;} while (current != this.head); // 循环直到回到头节点return -1; // 没有找到}// 求双向循环链表的长度,即元素个数public int getLength() {if (this.head == null) {return 0; // 空链表}DoubleListNode current = this.head;int count = 0;do {count++;current = current.next;} while (current != this.head); // 循环直到回到头节点return count;}}// 测试集public static void main(String[] args) {SXLB TEXT = new SXLB();//测试空表System.out.println("***测试第一个任务:建立一个空表");System.out.println("链表是否为空: " + TEXT.isEmpty());TEXT.append(0,0);System.out.println("链表是否为空: " + TEXT.isEmpty());System.out.println("***测试第一个任务完成");System.out.println();//测试在第i个位置插入X元素System.out.println("###测试第二个任务和第七个任务:在第i个位置插入元素X 输出所有值");TEXT.append(1,1);TEXT.append(2,12);TEXT.append(3,123);TEXT.append(4,1234);TEXT.append(5,12345);TEXT.append(6,123456);System.out.println("****顺序输出(双向循环链表)*****");TEXT.qianprint();System.out.println("###测试第二个任务和第七个任务成功");System.out.println();// 测试删除节点System.out.println("$$$测试第三个任务:删除第i个位置的元素");System.out.println("$$$测试第三个任务:删除第3个位置的元素");// 测试删除节点TEXT.delete(3);TEXT.qianprint();System.out.println("$$$测试第三个任务成功:删除第3个位置的元素");System.out.println();//测试取元素System.out.println("@@@测试第四个任务:取第i个位置的元素");System.out.println("@@@测试第四个任务:取第3个位置的元素");System.out.println(TEXT.getElement(3));System.out.println("@@@测试第四个任务成功"); //!!!需要printSystem.out.println();//返回第一次出现位置号System.out.println("&&&测试第五个任务:返回元素第一次出现的位置");System.out.println(TEXT.firstappear(1234)); //!!!需要printSystem.out.println("&&&测试第五个任务成功");System.out.println();//测试求链表长度System.out.println("===测试第六个任务:返回元素第一次出现的位置");TEXT.qianprint();System.out.println(TEXT.getLength());System.out.println("===测试第六个任务成功");System.out.println();// 测试从后往前输出System.out.println("---测试第八个任务:返回元素第一次出现的位置");TEXT.hoprint();System.out.println("---测试第八个任务成功");System.out.println();}
}

image-20241217162312349


http://www.ppmy.cn/ops/143891.html

相关文章

webpack打包流程及原理

Webpack 是一个模块打包工具&#xff0c;它可以分析项目的依赖关系&#xff0c;将这些依赖转换和打包为合适的格式以供浏览器使用。以下是 Webpack 打包流程的简化版&#xff1a; **初始化&#xff1a;**读取 webpack 配置文件&#xff0c;创建 compiler 对象。 **配置&#x…

学习笔记:Verilog连续赋值及在线仿真

参考 https://www.runoob.com/w3cnote/verilog-assign.htmlassign&#xff0c; 全加器 连续赋值语句是 Verilog 数据流建模的基本语句&#xff0c;用于对 wire 型变量进行赋值 assign LHS_target RHS_expression &#xff1b; LHS&#xff08;left hand side&#xff09; 指赋…

使用Python实现无人机自动导航系统:探索智能飞行的奥秘

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…

【HTML】Shadow DOM

Shadow DOM 允许将隐藏的 DOM 树附加到常规的 DOM 树中。它以 shadow root 节点为起始根节点&#xff0c;在这个根节点的下方&#xff0c;可以是任意元素&#xff0c;和普通的 DOM 元素一样。这样&#xff0c;你就可以创建一个独立的 DOM 子树&#xff0c;它与主文档隔离开来&a…

服务器被入侵登录不上怎么办?

在数字化时代&#xff0c;服务器作为数据存储与业务运行的核心载体&#xff0c;其安全性直接关系到企业的生死存亡。然而&#xff0c;随着网络攻击手段的不断升级&#xff0c;服务器被入侵的事件屡见不鲜&#xff0c;导致系统瘫痪、数据泄露等严重后果。当您发现自己的服务器被…

python elasticsearch 8.x通过代理发起请求方法

由于python elasticsearch v8 engine的源码包中并未开放对于请求添加proxies的支持&#xff0c;导致在某些环境下无法连通外网的es服务。目前网上暂无相关的修改内容&#xff0c;我这边提供下自己修改的动态运行时替换elasticsearch包的源码方法demo import gzip import ssl i…

点击数字层级从 admin.vue 跳转到 inviter-list.vue 组件

文章目录 1、admin.vue2、inviter-list.vue 1、admin.vue 好的&#xff0c;我们来分析一下代码中“层级”这一列的逻辑&#xff0c;并探讨它与后端的关联。 “层级” 列的逻辑 在您的代码中&#xff0c;“层级”列的渲染逻辑如下&#xff1a; <el-table-columnalign&quo…

Immer编写更简单的逻辑

Immer 当我们在更新一个复杂的嵌套对象时&#xff1a; const [person, setPerson] useState({name: Niki de Saint Phalle,artwork: {title: Blue Nana,city: Hamburg, image: https://i.imgur.com/Sd1AgUOm.jpg,} });如果想要更新person.artwork.city的值&#xff0c;可…