单向链表 双向链表 java代码实现

文章目录

  • 单向链表
    • 代码实现
    • 单元测试
    • 控制台打印
      • 头插法
      • 尾插法
  • 双向链表
    • 代码实现
    • 单元测试
    • 控制台打印
      • 头插法
      • 尾插法

单向链表

代码实现

package csdn.dreamzuora.list;/***  @author: weijie*  @Date: 2020/10/15 15:28*  @Description:*/ 
public class SingleNode {int id;String name;SingleNode next;public SingleNode(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "Node{" +"id=" + id +", name='" + name + '\'' +", next=" + next +'}';}
}
package csdn.dreamzuora.list;/*** @Author weijie* @Date 2020/10/14 18:46* @Description 单向链表*/
public class SingleLinkedList {/*** 无数据头结点*/private SingleNode headNode = new SingleNode(0, "head");private SingleNode tailNode = headNode;/*** 尾插法:顺序* @param appendNode*/public void tailAppend(SingleNode appendNode){tailNode.next = appendNode;tailNode = appendNode;}/*** 头插法:逆序* @param appendNode*/public void headAppend(SingleNode appendNode){SingleNode childNode = headNode.next;if (childNode == null){tailNode.next = appendNode;tailNode = appendNode;}else {headNode.next = appendNode;appendNode.next = childNode;}}/*** 打印链表*/public void show(){SingleNode childNode = headNode;while (childNode.next != null){SingleNode next = childNode.next;System.out.print("->" + next.name);childNode = next;}}}

单元测试

package csdn.dreamzuora.list;import org.junit.After;
import org.junit.Test;import static org.junit.Assert.*;/*** @Author weijie* @Date 2020/10/15 14:33* @Description*/
public class SingleLinkedListTest {SingleLinkedList list = new SingleLinkedList();@Testpublic void tailAppend() {for (int i = 0; i < 10; i++){SingleNode appendNode = new SingleNode(i, "node-" + i);list.tailAppend(appendNode);}}@Testpublic void headAppend() {for (int i = 0; i < 10; i++){SingleNode appendNode = new SingleNode(i, "node-" + i);list.headAppend(appendNode);}}@Afterpublic void showList(){list.show();}
}

控制台打印

头插法

在这里插入图片描述

尾插法

在这里插入图片描述

双向链表

代码实现

package csdn.dreamzuora.list;/*** @Author weijie* @Date 2020/10/15 10:20* @Description*/
public class DoubleNode {int id;String name;/*** 后继节点*/DoubleNode next;/*** 前驱节点*/DoubleNode last;public DoubleNode(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "DoubleNode{" +"id=" + id +", name='" + name + '\'' +'}';}
}
package csdn.dreamzuora.list;import java.util.ArrayList;
import java.util.List;/*** @Author weijie* @Date 2020/10/15 10:19* @Description 双向链表*/
public class DoubleLinkedList {/*** 无数据头节点*/private DoubleNode headNode = new DoubleNode(0, "head");private DoubleNode tailNode = headNode;/*** 尾插法* @param appendNode*/public void tailAppend(DoubleNode appendNode){tailNode.next = appendNode;appendNode.last = tailNode;tailNode = appendNode;}/*** 头插法* @param appendNode*/public void headAppend(DoubleNode appendNode){DoubleNode childNode = headNode.next;if (childNode == null){headNode.next = appendNode;appendNode.last = headNode;}else {appendNode.next = childNode;appendNode.last = headNode;childNode.last = appendNode;headNode.next = appendNode;}}/*** 打印链表*/public void show(){DoubleNode childNode = headNode;List<String> nextList = new ArrayList<String>();List<String> lastList = new ArrayList<String>();while (childNode.next != null){DoubleNode node = childNode.next;childNode = node;nextList.add("->" + node.name);DoubleNode nodeLast = childNode.last;lastList.add("<-" + nodeLast.name);}System.out.print("打印后继节点: ");nextList.forEach(elem -> System.out.print(elem));System.out.println();System.out.print("打印前驱节点: ");lastList.forEach(elem -> System.out.print(elem));System.out.println();}}

单元测试

package csdn.dreamzuora.list;import org.junit.After;
import org.junit.Before;
import org.junit.Test;import static org.junit.Assert.*;/*** @Author weijie* @Date 2020/10/15 14:51* @Description*/
public class DoubleLinkedListTest {DoubleLinkedList list = new DoubleLinkedList();@Testpublic void tailAppend() {for (int i = 0; i < 10; i++){list.tailAppend(new DoubleNode(i, "node-" + i));}}@Testpublic void headAppend() {for (int i = 0; i < 10; i++){list.headAppend(new DoubleNode(i, "node-" + i));}}@Afterpublic void showList(){list.show();}
}

控制台打印

头插法

在这里插入图片描述

尾插法

在这里插入图片描述

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

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

相关文章

栈、队列 java代码实现

文章目录普通队列数组实现java代码实现单元测试控制台打印链表实现java代码实现单元测试控制台打印LinkedList队列使用优先队列&#xff1a;PriorityQueue使用栈数组实现java代码实现单元测试控制台打印链表实现java代码实现单元测试控制台打印普通队列 概念&#xff1a;先入先…

ElasticSearch入门篇

文章目录控制台RESTFULL操作REST风格说明基于REST命令说明&#xff1a;es支持的数据类型核心数据类型ik分词器使用ik_smart最少切分ik_max_word最细粒度索引操作索引库创建创建文档方式指定索引类型(以后这种方式会被弃用)不指定索引类型利用默认的_doc类型更新文档方式一&…

【待完成】并发包下常用到线程工具类汇总

文章目录并发容器BlockingQueueArrayBlockingQueueLinkedBlockingQueuePriorityBlockingDelayQueueSynchronousQueueBlockingDequeCopyOnWriteCopyOnWriteArrayListCopyOnWriteArraySetConcurrentLinkedQueue/DequeConcurrentHashMapConcurrentSkipListMap/Set同步工具类AQS实现…

爬虫中如何获取页面编码类型

获取页面的编码格式的三种方式&#xff1a; 根据Response中的header获取编码格式根据页面标签中的meta获取根据页面内容识别自动识别出编码格式&#xff0c;经过测试准确率比较高 三种方式可以结合使用&#xff0c;由于inputStream不能够被复用&#xff0c;但是inputStrem没有…

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…

java核心技术-多线程并发设计原理以及常见面试题

文章目录写在前面多线程回顾Thread和Runnable面试官&#xff1a;为什么我们在项目中推荐使用使用Runnable方法而不用继承Thread&#xff1f;面试官&#xff1a;Callable为什么可以带返回值&#xff0c;你知道底层原理&#xff1f;面试题&#xff1a;线程了解&#xff1f;给我讲…

java核心技术-jvm基础知识

文章目录JVM回顾JVM、JRE、JDK之间关系&#xff1f;Java程序执行过程&#xff1f;面试官&#xff1a;解释执行和JIT(及时编译)两种执行方式有什么区别&#xff1f;java虚拟机内存管理jvm整体架构JVM只是定义内存划分规范等&#xff0c;具体实现依赖不同虚拟机实现&#xff0c;如…

多线程场景下利用ThreadLocal是线程安全?

文章目录背景多线程场景测试代码结论背景 ThreadLocal原理以及基本概念这里我就不介绍了&#xff0c;这里我们主要关注ThreadLocal是否是线程安全吗&#xff1f;其实如果我们知道ThreadLocal原理我们肯定知道它是线程安全的&#xff0c;但是我在开发的时候不放心做了个测试&am…

深入剖析线程池基本原理以及常见面试题详解

文章目录面试官&#xff1a;能给我讲讲线程池的实现原理&#xff1f;线程池类继承关系ThreadPoolExecutor核心数据结构面试官&#xff1a;给我讲讲线程池的有哪些参数&#xff1f;面试官&#xff1a;如何优雅的关闭线程&#xff1f;线程的生命周期面试官&#xff1a;线程池哪五…

设计模式七大设计原则

文章目录设计模式七大设计原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则-最少知道原则单一职责原则合成复用原则设计模式 面向对象的三个基本特征&#xff1a; 继承封装多态 设计模式体现了代码的耦合性、内聚性、可维护性、可扩展性、重用性、灵活性。 代码…

从框架源码中学习结构型设计模式

文章目录从框架源码学习结构型设计模式适配器模式应用实例案例一&#xff1a;dubbo框架日志适配器Logger接口日志实现类Logger适配器接口LoggerAdapter实现类Logger日志工厂桥接模式应用场景案例&#xff1a;dubbo源码-远程调用模块channelHandler设计ChannelHandler是一个SPI拓…

MDC日志logback整合使用

MDC日志logback整合使用 为什么使用MDC记录日志&#xff1f; 场景&#xff1a; 由于我的搜索服务并发量比较高&#xff0c;而处理一次搜索请求需要记录多个日志&#xff0c;因此日志特别多的情况下去查一次搜索整个日志打印情况会比较复杂。 解决方案&#xff1a; 可以使用用…

如何合理的配置线程数?

文章目录题记Java并发编程实战美团技术团队追求参数设置合理性线程池参数动态化题记 我想不管是在面试中、还是工作中&#xff0c;我们总会面临这种问题&#xff0c;那么到底有没有一种计算公式去告诉我们如何去配置呢&#xff1f; 答案是&#xff1a;没有 想要合理的配置线…

基于CompletableFuture并发任务编排实现

文章目录并发任务编排实现不带返回值/参数传递任务串行执行并行执行并行执行-自定义线程池阻塞等待&#xff1a;多并行任务执行完再执行任意一个任务并发执行完就执行下个任务串并行任务依赖场景带返回值/参数传递任务带返回值实现串行执行多线程任务串行执行对任务并行执行&am…

搜索研发工程师需要掌握的一些技能

文章目录基础语言数据结构与算法工程方面搜索相关搜索主要模块电商搜索流程分词相关搜索召回相似度算法相关词推荐排序相关国美搜索搜索算法工程师需要掌握的技能基础 语言 大部分公司用的是Solr、ElasticSearch&#xff0c;都是基于Java实现的&#xff0c;因此熟悉掌握Java语…

Flink入门看完这篇文章就够了

文章目录第一章&#xff1a;概述第一节&#xff1a;什么是Flink&#xff1f;第二节&#xff1a;Flink特点&#xff1f;第三节&#xff1a;Flink应用场景&#xff1f;第四节&#xff1a;Flink核心组成第五节&#xff1a;Flink处理模型&#xff1a;流处理和批处理第六节&#xff…

word小结

域代码/域结果显示设置 word选项---->>高级------>>显示域代码而非域值将样式传给其它文件使用 首先启动Word打开包含这些样式的一个文件&#xff0c;然后选择“工具”---->“模板和加载项”。在弹出的对话框中单击“管理器”按钮。在弹出的“管理器”对话框中&…

线程属性总结

今天面试那哥们问起线程属性&#xff0c;me竟然就说出了一个&#xff0c;囧 学习&#xff1a;http://blog.csdn.net/zsf8701/article/details/7842392 http://blog.csdn.net/jxhnuaa/article/details/3254299 http://blog.sina.com.cn/s/blog_9bd573450101hgdr.html int pthre…

百度2015校园招聘软件开发笔试题及答案

简单题&#xff08;本题共30分&#xff09; 请简述Tcp-ip的3次握手以及4次挥手过程&#xff1f;并解释为何关闭连接需要4次挥手(10分) 详细答案参见TCP/IP协议三次握手与四次握手流程解析 TCP三次握手、四次挥手过程如下: 通常情况下&#xff0c;一个正常的TCP连接&#xf…