看一下链表结构

序、慢慢来才是最快的方法。

背景

链表(Linked List)
链表是一种常见的基础数据结构,是一种线性表。与顺序表不同的是,链表中的每个节点不是顺序存储的,而是通过节点的指针域指向到下一个节点。

1.链表的优缺点

2.链表的类型

单链表、双链表、循环链表、静态链表。

1.单链表

  • element:用来存放元素
  • next:用来指向下一个节点元素
  • 通过每个结点的指针指向下一个结点从而链接起来的结构,最后一个节点的next指向null。

代码示例:

//单向链表
class SingleLinkedList{//先初始化一个头节点, 头节点不要动, 不存放具体的数据private Node head = new Node("");//添加节点public void add(Node node){Node temp = head;while (true){if(temp.next == null){break;}temp = temp.next;}temp.next = node;}// 插入新节点到链表的头部  public void insertAtHead(String data) {  Node newNode = new Node(data);  if (head != null) {  //新链表的next直接指向head即可。newNode.next = head;  }  head = newNode;  }  //删除节点public void del(String element) throws Exception {Node temp = head;boolean flag = false; // 标志是否找到待删除节点的while (true){if(temp.next == null){//最后一个节点break;}if(temp.next.element == element){flag = true;break;}temp = temp.next;}if(flag){temp.next = temp.next.next;} else {throw new Exception("没有找到要删除的节点");}}//定义节点class Node{public String element;//用来存放元素public Node next; //指向下一个节点public Node(String element) {super();this.element = element;}}
}

单链表反转

反转链表问题在面试中出现频率 非常非常高,相信有过几次面试经验的同学都会同意这个观点。

解法1:递归
  //递归解法private Node reversetList(Node node) {if (node == null || node.next == null) {return head;}Node nodePre= reversetList(node);node.next.next = node.next;node.next = null;return nodePre;}
解法2:迭代
   //单链表反转 迭代private Node reversetList1(Node node) {//如果当前链表为null,或者只有一个节点,则无需反转if (node == null && node.next == null) {return node;}//定义一个辅助的指针(变量),帮助我们遍历原来的链表Node cur = node.next;Node next = null;// 指向当前节点[cur]的下一个节点Node reverseNode = new Node("");while (cur != null) {next = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用cur.next = reverseNode.next;///将cur 的下一个节点指向新的链表的最前端reverseNode = cur;将cur 连接到新的链表上cur = next;//让cur 后移}return reverseNode;}

2.双链表

单向链表的好处很多,虽然单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后" 找,而 "从后往前" 找并不是它的强项,因此我们就有了双向链表这个东西,双向链表顾名思义就是链表的高级版,他与单向链表有所不同的一点在于在具有尾巴结点,并且双向链表的每一个结点都会有两个指向,一个指向前面的结点,一个指向后面的结点,当然头结点的前端指向为null,后结点的后端指向为null。
 

element、pre、next 跟前面的一样。

第一个节点的pre指向最后一个节点,最后一个节点的next指向第一个节点,形成一个环。

代码示例

public ListNode head;public ListNode last;public TowWayNodeList(int num){this.head = new ListNode(num);this.last = this.head;}//头插法public void addFirst(int num){ListNode node = new ListNode(num);if(head == null){this.head = node;this.last = node;}else{node.next = this.head;this.head.prev = node;this.head = node;}}//尾插发
public void addLast(int data){ListNode node = new ListNode(data);if(head == null){this.head = node;this.last = node;}else{this.last.next = node;node.prev = this.last;this.last = node;}}

参考

数据结构与算法 #1 链表问题总结 - 掘金

leetcode 206 号算法题:反转单链表【数据结构与算法】_哔哩哔哩_bilibili

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

Java实现双向链表_双向链表java实现_跑不死的程序员的博客-CSDN博客

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

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

相关文章

C++ 位图与布隆过滤器

目录 前言位图场景演示应用场景模拟实现问题例题 布隆过滤器例子理解应用 例题 前言 位图与布隆过滤器是用来在海量数据中判断一个数据在不在的问题的数据结构,这种数据结构在存储空间上大大的优于红黑树、哈希等数据结构 位图 我们为了处理一个数据在海量数据中…

SSM整合RabbitMQ,Spring4.x整合RabbitMQ

SSM整合RabbitMQ目录 前言版本实现目录参考pom.xml依赖rabbitmq.properties配置文件spring-rabbitmq.xmlspring-mvc.xml或applicationContext.xmlrabbitmq目录下MessageConsumer.javaMessageConsumer2.javaMessageProducer.javaMessageConstant.java 测试调用 扩展消息重发方式…

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘,删除主库过期wal文件重做备库后上午进行主备状态巡查,主库向备库发送wal文件正常,但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…

甘特图组件DHTMLX Gantt示例 - 如何有效管理团队工作时间?(一)

如果没有有效的时间管理工具,如工作时间日历,很难想象一个项目如何成功运转。这就是为什么我们的开发团队非常重视项目管理,并提供了多种选择来安排DHTMLX Gantt的工作时间。使用DHTMLX Gantt这个JavaScript库,您可以创建一个强大…

Java架构师缓存架构设计解决方案

目录 1 缓存常见的三大问题1.1 缓存雪崩1.2 缓存穿透1.3 缓存击穿2 缓存key的生成策略3 热点数据集中失效的问题4 如何提高缓存的命中率5 缓存和数据库双写不一致的问题6 如何对缓存数据进行分片1 缓存常见的三大问题 缓存雪崩、缓存穿透和缓存击穿是缓存系统中常见的三大问题,…

日常学习记录随笔-大数据之日志(hadoop)收集实战

数据收集(nginx)--->数据分析---> 数据清洗--->数据聚合计算---数据展示 可能涉及到zabix 做任务调度我们的项目 电商日志分析 比如说我们现在有一个系统,我们的数仓建立也要有一个主题 我这个项目是什么我要干什么定义方向 对用户进行分析,用户信息 要懂整个数据的流…

理解LoadRunner,基于此工具进行后端性能测试的详细过程(上)

1、LoadRunner 的基本原理 后端性能测试工具通过虚拟用户脚本生成器生成基于协议的虚拟用户脚本,然后根据性能测试场景设计的要求,通过压力控制器控制协调各个压力产生器以并发的方式执行虚拟用户脚本,并且在测试执行过程中,通过…

【手写数字识别】数据挖掘实验二

文章目录 Ⅰ、项目任务要求任务描述:主要任务要求(必须完成以下内容但不限于这些内容): II、实现过程数据集描述实验运行环境描述KNN模型决策树模型朴素贝叶斯模型SVM模型不同方法对MNIST数据集分类识别结果分析(不同方法识别对比率表及结果分析) 完整代…

2023最新pytorch安装教程,简单易懂,面向初学者(Anaconda+GPU)

一、前言 目前是2023.1.27,鉴于本人安装过程中踩得坑,安装之前我先给即将安装pytorch的各位提个醒,有以下几点需要注意 1.判断自己电脑是否有GPU 注意这点很重要,本教程面向有NVIDA显卡的电脑,如果你的电脑没有GPU或者使用AMD显…

2023-10-12 LeetCode每日一题(找出数组的串联值)

2023-10-12每日一题 一、题目编号 2562. 找出数组的串联值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 。 现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。 例如,15 和 49 的串联是 1549 。 nums 的 串…

QT运行界面与画布大小不一致问题(一步到位)

QT运行界面与画布大小不一致问题 出现的问题直接设置环境变量main函数中输入以下代码更改系统缩放比好了,看一下运行结果吧 出现的问题 当我们运行程序时,发现运行出来的大小和设计的几面大小有很大的差别,这使我们开发起来就特别的困难&…

iOS 面试题以及自我理解答案

1、简述push原理,push的证书和其他的有什么不一样? 第 一阶段:BeejiveIM服务器把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身的已注册Push服务 的iPhone列表中,查找有相应标识的iP…