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 上的步骤进行安装…

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 5.1.53_mysql 5.1.53免安装版的优化配备和精简

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

python牛顿法寻找极值_python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例...

Rosenbrock函数的定义如下&#xff1a;其函数图像如下&#xff1a;我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验。梯度下降梯度下降的更新公式&#xff1a;图中蓝色的点为起点&#xff0c;橙色的曲线(实际上是折线)是寻找最小值点的轨迹&#xff0c;终点(最小值点…

mysql报11004_使用mysqli扩展技术查看服务器连接错误报告的方法

使用mysqli扩展技术查看服务器连接错误报告的方法作为PHP的黄金搭档MySQL数据库&#xff0c;在PHP项目开发过程中有着举足轻重的作用&#xff0c;这不仅因为MySQL是完全免费的&#xff0c;而且和PHP一样都是完全跨平台的。但在实际项目开发过程中&#xff0c;PHP与MySQL数据库产…

_Linux进程信号详解

信号是什么一个信号就是一条小消息&#xff0c;它通知进程系统中发生了一个某种类型的事件信号是多种多样的&#xff0c;并且一个信号对应一个事件&#xff0c;这样才能做到收到一个信号后&#xff0c;知道到底是一个什么事件&#xff0c;应该如何处理&#xff08;但是要保证必…

java乘法表_Java中四种9*9乘法表的实现方式(附代码)

前言: 初学java,实现99乘法表是必学必会的内容。需求 : 分别写出上下左右,对应四个角的乘法表。思路: 可以先打印出*星星,形成一个直角三角形,然后再替换成乘法公式。代码如下:public class Demo {public static void main(String[] args) {for (int i 1; i <5 ; i) {for (…

excel表格不够怎么添加_Excel表格水印,你以前好象添加错了!

为excel表格添加水印&#xff0c;通常是使用插入-艺术字来完成。但这样做有一个很大的问题&#xff1a;如果表格有很多页&#xff0c;就需要添加N多个艺术字&#xff0c;太麻烦了。其实有一个超简单的批量设置方法&#xff0c;再多页也可以一次性设置。需要添加水印的Excel表格…

电脑手机wifi互传文件_安卓手机文件互传

怎么不借用第三方工具&#xff0c;安卓手机实现相互文件快传呢&#xff1f;苹果&#xff1a;首先不用多说&#xff0c;苹果可以使用Air Drop功能&#xff0c;苹果全家桶可以无障碍互传。长期以来&#xff0c;除开微信和QQ&#xff0c;不同品牌安卓手机互传文件依靠的途径只有蓝…

传统的线性降维方法效果不佳。_10分钟数据降维入门

1. 前言在硕士期间学习研究了数据降维相关的知识&#xff0c;阅读了一些相关文章&#xff0c;也断断续续在知乎上写了一些数据降维的入门级文章&#xff0c;收获了一些小伙伴的赞同&#xff0c;并在GitHub上开源了一些特征抽取算法的源代码&#xff0c;获得了的1.1kstar。因为在…

嵌入式开发网络配置——windows连热点,开发板和电脑网线直连

目录 电脑 WiFi 上网&#xff0c;开发板和电脑直连 使用场景 设置VMware虚拟机的网络配置 Ubuntu设置——版本18.04 ​编辑 windows设置 开发板设置 原因&#xff1a;虚拟机Linux移植可执行程序到开发板失败 最后发现虚拟机的Linuxping不通开发板 下面是我的解决方法 …

java ajax data_jquery ajax 方法中传递的data参数,如何在java类中获取

展开全部var params"username""1";$.ajax({type : "POST", //数据发送方式url : "../servlet/clearCache",dataType : "json", //接受数据格式 (这里有很多,常用的有html,xml,js,json)data:params,//datenew Date(), 要传递…

python环境变量配置_Python的安装、认识、配置环境变量以及helloworld打印的两种方式

Python的安装、认识、配置环境变量以及helloworld打印的两种方式 一、 安装和配置环境变量 首先我们去到Python的官方下载地址根据自己的电脑机型来下载最新的python安装包&#xff0c;网址是https://www.python.org/downloads/ 。 或者点击这里跳转 。 下载之后可以去https://…

java 报表程序_java 报表

http://www.codeceo.com/article/8-java-graph.html前段时间我们为大家分享过一些最常用的Java图表应用和Android图表应用&#xff0c;无论是在PC平台上还是移动平台上&#xff0c;图表和报表功能都是不可或缺的。本文推荐了8款最精彩实用的Java图表应用&#xff0c;大部分图表…