双向链表实现思路
双向链表
实现思路
遍历
- 和单向链表的遍历相同,需要一个辅助节点来保存当前正在遍历的节点
添加
- 双向链表多出了一个front,所以在添加时,要让新增节点的front指向链表尾节点
修改
- 和单向链表的修改相同
删除
- 使用temp来保存要删除的节点
- temp.front.next指向temp.next
- temp.next指向temp.front
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | package com.wyh.linkedlist; public class DoubleLinkedListDemo { public static void main(String[] args) { StudentLinked studentLinked = new StudentLinked(); studentLinked.addNode( new Node( 1 , "张三" )); studentLinked.addNode( new Node( 2 , "李四" )); studentLinked.addNode( new Node( 3 , "王五" )); studentLinked.addNode( new Node( 4 , "二蛋" )); studentLinked.updateNode( new Node( 4 , "狗蛋儿" )); studentLinked.delete( 4 ); studentLinked.list(); } } class StudentLinked{ //定义头节点 private Node head = new Node( 0 , "" ); //遍历双向链表 public void list(){ if (head.next == null ){ System.out.println( "链表为空" ); return ; } Node temp = head.next; while ( true ){ if (temp == null ){ break ; } System.out.println(temp); temp = temp.next; } } //添加节点 public void addNode(Node newNode){ Node temp = head; while (temp.next!= null ){ temp = temp.next; } temp.next = newNode; newNode.front = temp; } //删除节点 public void delete( int no){ if (head.next == null ){ System.out.println( "链表为空" ); return ; } Node temp = head.next; boolean flag = true ; while (temp!= null ){ if (temp.no == no){ if (temp.next!= null ){ temp.next.front = temp.front; } temp.front.next = temp.next; flag = false ; } temp = temp.next; } if (flag){ System.out.println( "未找到节点" ); } } //更改节点的信息 public void updateNode(Node newNode) { if (head.next == null ){ System.out.println( "队列为空,无法更改" ); return ; } Node temp = head.next; boolean flag = false ; while ( true ){ if (temp == null ){ break ; } if (temp.no == newNode.no){ flag = true ; break ; } temp = temp.next; } if (flag){ temp.name = newNode.name; } else { System.out.printf( "没有找到编号为%d的节点,无法修改\n" ,newNode.no); } } } //定义节点的类 class Node{ public int no; public String name; public Node next; //指向下一个节点 public Node front; //指向上一个节点 public Node( int no, String name) { this .no = no; this .name = name; } @Override public String toString() { return "Node{" + "no=" + no + ", name='" + name + '\ '' + '}' ; } } |
本文来自博客园,作者:腹白,转载请注明原文链接:https://www.cnblogs.com/wyh518/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?