java单链表节点翻转_Java数据结构01-链表基础(讲解+代码+面试题)

文章结构

  1. 链表的概念/用处
  2. 链表的基本代码实现(韩顺平Java数据结构网课)
  3. 剑指offer上链表题目代码实现(个人手敲,更精巧的答案可以参考官网)

链表

链表包含单链表,双向链表,循环链表等等。相对于线性表,添加,删除操作非常方便,因为不用移动大量的节点,只需要修改对应的前后节点指针即可。下面用一个具体实例来说明下这种结构。现在有一需求,是将具有不同编号,姓名,昵称的人添加到系统中。首先需要创建节点,既然是链表,节点除了基本信息也要加入下一节点指针,方便计算机在内存中查找。

单向链表是通过指针构建的列表,基本结构就是头节点+下一节点地址指针--->节点+下一节点地址指针--->尾节点。

22a565fb0de4b16fbee4cdc26a5044c7.png

单链表的基本代码实现

在这里强推一波韩顺平的Java数据结构网课,讲的由浅入深,笔记详细。当然自己看视频之后自己再写才是正道。

https://www.bilibili.com/video/av54029771?from=search&seid=15096936792873170656​www.bilibili.com
class HeroNode{public int no; //编号public String name; //姓名public String nickname;//昵称public HeroNode next; //下一节点指针//构造器public HeroNode(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;		}@Overridepublic String toString() {return "HeroNode [no = " + no + ", name " + name + ", nickname = " + nickname;}}

下一步是创建链表类,包括一些基本操作方法

class SingleLinkedList{//初始化头节点,头节点不动private HeroNode head = new HeroNode(0, "", "");//返回头节点,方便后续操作public HeroNode getHead() {return head;}//添加节点内到单向链表//思路,当不考虑编号顺序,找到当前链表的最后节点,将最后节点的next指向新节点public void add(HeroNode heroNode) {HeroNode temp = head;//遍历链表,找到最后while(true) {if(temp.next == null) {break;}//如果没有找到,将temp后移temp = temp.next;}temp.next = heroNode;}//按照顺序添加public void addByOrder(HeroNode heroNode) {//头节点不能动,通过辅助指针//单链表,因此temp在添加位置的前一个结点HeroNode temp = head;boolean flag = false; //编号是否存在while(true) {if(temp.next == null) {//链表最后break;}if(temp.next.no > heroNode.no) {//位置找到break;}else if(temp.next.no == heroNode.no){//编号存在flag = true;		}temp = temp.next;}if(flag) {System.out.printf("编号%d存在", heroNode.no);}else {heroNode.next = temp.next;temp.next = heroNode;}}//更新链表,在找到序号的情况下进行更新public void update(HeroNode newHeroNode) {//根据no修改if(head.next == null) {System.out.println("链表为空");return;}HeroNode temp = head.next;boolean flag = false;while(true) {if(temp == null) {break;}if(temp.no == newHeroNode.no) {flag = true;break;}temp = temp.next;}if(flag) {temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;}else {System.out.printf("没找编号%d的值", newHeroNode.no);}}//删除节点//head不动,找到被删除节点的前一个public void del(int no) {HeroNode temp = head;boolean flag = false;while(true) {if(temp.next == null) {break;}if (temp.next.no == no) {flag = true;break;}temp = temp.next;}if(flag) {temp.next = temp.next.next;}else {System.out.printf("要删除的节点%d不存在", no);}}	}

这里说下头节点存在的意义:

1.防止单链表是空的而设的,否则空链表头指针就会指向null.

2.方便插入表头或者删除第一个结点

剑指offer涉及到的链表题目

8f96127a85a2024cfae4981c0ca79e51.png

第一题:从尾到头打印链表

思路:递归,深入到最底层取出节点.val值后一层一层回退

import java.util.ArrayList;
public class Solution {ArrayList<Integer> list = new ArrayList<Integer>();public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {if(listNode != null){this.printListFromTailToHead(listNode.next);list.add(listNode.val);}return list;}
}

第二题:输入一个链表,输出该链表中倒数第k个结点。

思路1 传统法得到链表长度L,再从头遍历到L-k个

思路2 快慢指针,慢指针距离快指针始终k,当快指针到最后的null时候,输出慢指针

代码是思路2

public class Solution {public ListNode FindKthToTail(ListNode head,int k) {//快慢指针ListNode fast = head;ListNode slow = head;for(int i = 0; i < k; i++){if(fast == null){return null;}       fast = fast.next;}while(fast != null){fast = fast.next;slow = slow.next;}return slow;}
}

第三题:输入一个链表,反转链表后,输出新链表的表头。

思路:本能反应是遍历到最后,倒数第二,第三以此类推,但是这样每次都遍历一遍链表花销太大。最清真的思路是采用头插法,先建立一个新的头节点,依次将链表中的节点插入到新头节点后边的第一个位置,以此类推。这里需要注意的是为了防止断链,要建立额外指针来储存当前插入点current在原链表的下一个节点。

题外话:韩老师的视频里面头节点是没有数据的,这个题目Head是有数据的,害得我提交很多次都不合格。下面这个是head无数据版本

public class Solution {public ListNode ReverseList(ListNode head) {if(head.next == null || head.next.next == null) {return head;}//辅助指针,遍历原来的链表ListNode cur = head.next.next;ListNode next = null; //指向cur的下一个节点 防止断链ListNode reverseHead = null;while( cur != null) {next = cur.next;//暂时保存后面有用cur.next = reverseHead.next;//cur的下一个节点指向新链表的最前端reverseHead.next = cur;//cur连接到新的链表最顶端cur = next;}return reverseHead;}
}

下面这个是head有数据版本

public class Solution {public ListNode ReverseList(ListNode head) {if(head==null)return null;ListNode pre = null;ListNode next = null;while(head!=null){next = head.next;head.next = pre;pre = head;head = next;}return pre;}
}

第四题:合并两个有序链表

/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Solution {public ListNode Merge(ListNode list1, ListNode list2) {if (list1 == null) {return list2;}if (list2 == null) {return list1;}ListNode temp = null;ListNode mergeHead = null;while (list1 != null && list2 != null) {if (list1.val < list2.val) {if (mergeHead == null) {mergeHead = list1;temp = list1;} else {temp.next = list1;temp = temp.next;}list1 = list1.next;} else {if (mergeHead == null) {mergeHead = list2;temp = list2;} else {temp.next = list2;temp = temp.next;}list2 = list2.next;}}if (list1 == null) {temp.next = list2;} else {temp.next = list1;}return mergeHead;}
}

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

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

相关文章

分解连续自然数的和_小学奥数各年级经典题解题技巧大全——分解因数法(2)...

*例7&#xff1a;在等式35( )8127718( )162的两个括号中&#xff0c;填上适当的最小的数。(适于六年级程度)解&#xff1a;将已知等式的两边分解质因数&#xff0c;得&#xff1a;5377( )22367( )把上面的等式化简&#xff0c;得&#xff1a;15( )4( )所以&a…

即席和即兴_即兴说话小课堂

即 兴 说 话 小 课 堂了解发音的小知识&#xff0c;运用语言技巧&#xff0c;通过音色、音强&#xff0c;来达到的一种发音。发音的能力&#xff0c;更重要的是提高自己的普通话水平&#xff0c;锻炼自己的综合能力。师兄的课堂是非常难得&#xff0c;大家一起来学习吧&a…

云片短信php接口_php与阿里云短信接口接入

使用阿里云短信API&#xff0c;需要在控制台获取以下必要参数&#xff0c;其中需要自己手机验证官方审核多次&#xff0c;尤其审核需要保持耐心。1. accessKeyId 相当于你的个人账户密钥&#xff1b;2. accessKeySecret 与上是成对的&#xff1b;3. SignName 个人签名&#xff…

读中文_校友分享预告 | 在港中文读物理是什么体验?理科就业转商科有何经验心得?...

留学分享会总第233期港新地区校友分享实录商科《19年入读港大金融师姐带来最新香港就读体验与求职经验》《在香港大学读金融是怎样一种体验&#xff1f;》《在香港大学读会计是怎样一种体验&#xff1f;》《在香港大学读商业分析是怎样一种体验&#xff1f;》《在新加坡国立大学…

命令逐行显示_在LoadRunner中执行命令行程序之:popen()取代system()

》》》推荐阅读《《《1、性能测试学习笔记-场景设计2、性能测试的重要意义3、性能分析流程及方法4、应用系统性能调优之性能分析在LoadRunner中执行命令行程序之&#xff1a;popen()取代system() 我想大家应该都知道在LoadRunner可以使用函数system()来调用系统指令&#xf…

的使用go_使用 Go 开发 Prometheus Exporter

Exporter 是 Prometheus 监控的核心&#xff0c;如果你遇到一些应用不存在相应的 Exporter&#xff0c;那么我们可以自己去编写 Exporter。下面我们简单介绍如何使用 Golang 来快速编写一个 Exporter。1. 安装 GO 和依赖包按照 https://golang.org/doc/install 上的步骤进行安装…

tensorflow中的正则化函数在_tensorflow中的正则化及数据增强

正则化&#xff1a;一般可以通过减少特征或者惩罚不重要特征的权重来缓解过拟合&#xff0c;但是我们通常不知道该惩罚那些特征的权重&#xff0c;而正则化就是帮助我们惩罚特征权重的&#xff0c;即特征的权重也会成为模型的损失函数一部分。可以理解为&#xff0c; 为了使用某…

flask 获取前端form内容_flask 项目中使用 bootstrapFileInput(进阶篇)

bootstrap 为 flask 使用人员提供了一个非常优美且有效的前端页面组件,但是完美之处还存在些许缺陷,比如文件的上传功能.而 bootstrap-fileinput 是基于 bootstrap 的控件,非常完美的填补了这个空缺.注意: 本文是基于 bootstrap-fileinput v4.4.2. github 地址: https://github…

phpstudy能安装不带mysql的么_装了phpstudy还需要装mysql吗

phpStudy是一个PHP调试环境的程序集成包。该程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer&#xff0c;一次性安装&#xff0c;无须配置即可使用&#xff0c;是非常方便、好用的PHP调试环境。该程序不仅包括PHP调试环境&#xff0c;还包括了开发工具、开发手册等。对…

mysql二进制备份配置_mysql针对于二进制数据的备份

由于这次项目文件存储部分数据是以二进制形式存储到mysql数据库中&#xff0c;这下移植开发环境的数据之前导出SQL的形式不行了&#xff0c;二进制的数据导出SQL没问题&#xff0c;但是导入就出现问题了。要是库中含有二进制数据&#xff0c;备份SQL这招肯定不行了&#xff0c;…

mysql 5.1.53_mysql 5.1.53免安装版的优化配备和精简

mysql 5.1.53免安装版的优化配置和精简[摘要]MySQL是一种关联数据库管理系统&#xff0c;关联数据库将数据保存在不同的表中&#xff0c;而不是将所有数据放在一个大仓库内。这样就增加了速度并提高了灵活性。本文介绍mysql-noinstall.zip免安装版的优化配置和精简。欢迎大家阅…

eomj表情 mysql_mysql 数据库支持emjoy表情

数据库支持emjoy表情对于emjoy表情&#xff0c;插入数据库的时候总是报错如下&#xff1a;Incorrect string value: \xF0\x9F\x98\x8D for column REAL_NAME at row 1从上面看出该字段不支持emjoy表情check查找发现emjoy表情采用的是utf8mb4存储,utf8mb4是utf8的超集(包含了一些…

linux c mysql教程_Linux c访问mysql 编写入门

一) 前置条件&#xff1a;(1) Linux 已经安装好 mysql 数据库&#xff1b;(2) Linux 已经安装了 gcc 编译器&#xff1b;(二)数据库准备&#xff1a;为了便于描述&#xff0c;假设数据库的 root 用户密码为 root_pwd 。(1) 以 root 用户登陆数据库#mysql -ur…

mysql性能优化 硬件优化_mysql性能优化学习笔记(6)数据库配置优化硬件优化...

一、操作系统配置优化&#xff1a;1. 网络方面&#xff0c;修改/etc/sysctl.conf文件&#xff0c;增加tcp支持的队列数&#xff0c;减少断开连接时&#xff0c;资源的回收。2. 打开文件数的限制。修改/etc/security/limits.conf文件&#xff0c;增加一下内容以修改打开文件数量…

mysql崩溃_mysql崩溃原因分析

最近开发人员那边总说他们的程序连接一台指定服务器的时候出现闪断的现象,有连接失败的日志生成.于是就登陆到这台机器上探查个究竟,看了下mysql的错误日志,发现有mysql崩溃的现象,数据目录下面生成好多的bin文件,错误日志里面的内容如下:090922 1:10:39 - mysqld got signal …

dataframe存到mysql中_pandas实现to_sql将DataFrame保存到数据库中

目的在数据分析时&#xff0c;我们有中间结果&#xff0c;或者最终的结果&#xff0c;需要保存到数据库中&#xff1b;或者我们有一个中间的结果&#xff0c;如果放到数据库中通过sql操作会更加的直观&#xff0c;处理后再将结果读取到DataFrame中。这两个场景&#xff0c;就需…

mysql用于放置可执行文件的目录_在 MySQL 安装目录中, bin 目录用于放置一些可执行文件。_面向对象程序设计(C#)答案_学小易找答案...

【单选题】形成通货膨胀的原因是( )【单选题】患者在就诊的过程中,其投入的最主要内容是( )。【多选题】25 、绝对剩余价值生产和相对剩余价值生产的区别和联系是( )【多选题】21 、劳动力成为商品的条件( )【单选题】所谓的内部服务指的是( )。【单选题】服务业主要对应的产业…

python 跳过计算错误_在python中计算分数时如何跳过被0除的错误?

我正在运行一个很长的CSV文件下面的函数。函数每50行计算列MFE的Z分数。这50行中有一些只包含零&#xff0c;因此在计算Zscore时&#xff0c;程序会停止&#xff0c;因为它不能被零除。如何解决这个问题&#xff0c;而不是停止程序运行打印这些行的z分数0&#xff1f;在def doZ…

python中的seed_Python seed() 函数 - Python 教程 - 自强学堂

Python seed() 函数描述seed() 方法改变随机数生成器的种子&#xff0c;可以在调用其他随机模块函数之前调用此函数。。语法以下是 seed(() 方法的语法:import randomrandom.seed ( [x] )注意&#xff1a;seed(()是不能直接访问的&#xff0c;需要导入 random 模块&#xff0c;…

ubuntu dpkg mysql_ubuntu-12.04 – 在Ubuntu 12.04上无法启动MySQL5.5 – “dpkg:依赖问题”...

这似乎是12.04上的一个常见问题。我在this thread尝试过&#xff0c;包括&#xff1a;sudo apt-get cleansudo apt-get autocleansudo apt-get remove --purge mysql-client-5.5 mysql-client-core-5.5 mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5sudo …