数据结构-链表练习(面试题)

1,翻转一个单链表

建立变量cur指向第二个节点,curN指向cur.next,将第二个节点的next改为head,head=cur这样实现,前两个节点顺序的翻转,第二个节点指向了第一个节点,之后cur向后移(cur=curN),curN也向后移,进行循环,直到所以节点的顺序都翻转

问:curN的作用是什么,为什么要这样定义?

答:因为进行反转时,这个节点的next要改为前一个节点的地址,所以这个节点和后一个节点就没有关系了,但是我们还需要找到后一个节点,依次进行翻转,所以设置变量,将后一个节点的地址提前记录下来

public void reverseList(){if (head==null){return;}ListNode cur=head.next;ListNode curNext=head.next.next;head.next=null;while (cur!=null){cur.next=head;head=cur;cur=curNext;if (curNext!=null){curNext=curNext.next;}}}

2.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

用快慢指针法:快指针一次走两步,慢指针一次走一步,所以快指针走的是慢指针的两倍路程,所以慢指针指向的是链表的中间值

链表的节点分两种情况,一种为单数,另一种为双数,第一种,fast指向最后一个节点,slow指向中间节点,第二种,fast指向空,slow指向中间的靠右的节点

public ListNode returnMid(){if (head==null){return null;}ListNode slow=head;ListNode fast=head;while (fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;}return slow;
}

3, 输入一个链表,输出该链表中倒数第k个结点

用快慢指针法:快指针先走k-1个节点,然后快指针和慢指针一起向后走,直到快指针的下一个为null,则慢指针指向倒数第k个结点

首先要判断输入坐标的合法性,和链表为空的情况

private void KLegal(int k){if (k<=0||k>size()){throw new IndexException("输入的第k个节点,k输入异常");}
}
private void heedIsNull(){if (head==null){throw new IndexException("head为空,该链表没有节点");}
}
public  int kthToLast(int k){try {KLegal(k);}catch (IndexException e){e.printStackTrace();}try {heedIsNull();}catch (IndexException e){e.printStackTrace();}ListNode slow=head;ListNode fast=head;while ((k-1)!=0){fast=fast.next;k--;}while (fast.next!=null){fast=fast.next;slow=slow.next;}return slow.val;
}

4,将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

建立一个空节点,比较链表1,和链表2,的值将比较大的值的节点放到空节点的后面

然后再将p1与p2的val进行比较重复上述操作,知道一个链表的节点为0,直接将另一个链表剩余的节点直接放到新建的链表后面,最后将建立的空节点删除

public ListNode mergeTowLists(ListNode head1,ListNode head2){ListNode node=new ListNode(0);ListNode cur=node;ListNode b1=head1;ListNode p1=head2;while (b1!=null&&p1!=null){if (b1.val<p1.val){cur.next=b1;cur=cur.next;b1=b1.next;}else {cur.next=p1;cur=cur.next;p1=p1.next;}}if (b1==null){cur.next=p1;}else {cur.next=b1;}return node.next;}

5,编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

以x为界限,创立两个分区,遍历链表,将小于x的放到第一个分区,大于x的放到第二个分区,采用尾插法放置

public ListNode partition(int k) {ListNode b1 = null;ListNode b2 = null;ListNode p1 = null;ListNode p2 = null;ListNode cur = head;while (cur != null) {if (cur.val < k) {if (b1 == null) {b1 = b2 = cur;} else {b2.next=cur;b2 = cur;}} else {if (p1 == null) {p1 = p2 = cur;} else {p2.next = cur;p2 = cur;}}cur = cur.next;}if (b1==null){return p1;}b2.next = p1;if (p1!=null){p2.next=null;}return b1;
}

6,判断回文

1,先用快慢指针,找到中间值,然后将中间值后面的节点翻转,然后,中间值以前的节点从前往后遍历,中间值以后的节点从后往前遍历,并对比节点的val是否相同,如果完全相同,则为回文,如果不相同,则不是

public boolean chkPalindrome(){if (head==null){return true;}ListNode slow=head;ListNode fast=head;while (fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;}ListNode cur=slow.next;ListNode curNext=cur.next;while (cur!=null){cur.next=slow;slow=cur;cur=curNext;if (curNext!=null){curNext=curNext.next;}}ListNode head1=head;while (slow!=head1&&head1.next!=slow){if (slow.val!=head1.val){return false;}slow=slow.next;head1=head1.next;}return true;
}

7, 输入两个链表,找出它们的第一个公共结点

先判断两个链表的长度,算出差值k,将长的链表向后走k步,然后,两个链表同时遍历,直到两个链表节点的next相等是,这next指向的节点就是公共节点

public  ListNode getIntersectionNode(ListNode head1,ListNode head2){ListNode p1=head1;//longListNode p2=head2;int len1=0;int len2=0;while (p1!=null){p1=p1.next;len1++;}while (p2!=null){p2=p2.next;len2++;}int len=len1-len2;p1=head1;p2=head2;if (len1<len2){p1=head2;p2=head1;len=len2-len1;}while (len!=0){p1=p1.next;len--;}while (p1!=p2){p1=p1.next;p2=p2.next;}return p1;}

8,成环的判断和成环的节点

成环的判断:快慢指针,快指针一次走两步,慢指针一次走一步,如果成环,快指针与慢指针总会相遇,所以当快指针等于慢指针时,则有环,如果遍历之后没有相遇,则没有环

public boolean isDetectCycle(){ListNode slow=head;ListNode fast=head;while (fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;if (fast==slow){return true;}}return false;
}

成环的节点:

有公式可推从头节点到成环节点的路程等于快指针与慢指针相遇的节点到成环节点的距离,所以将slow=head,快指针和慢指针同时走相遇的节点就是成环节点

public ListNode detectCycle(){ListNode slow=head;ListNode fast=head;while (fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;if (fast==slow){break;}}if (fast==null||fast.next==null){return null;}//排除没有环的情况slow=head;while (slow!=fast){slow=slow.next;fast=fast.next;}return slow;}

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

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

相关文章

设计模式之前端控制器模式

想象一下&#xff0c;你的Java Web应用是个交响乐团&#xff0c;每个功能模块是乐手&#xff0c;而用户请求就像是一首首待演绎的曲目。在这场音乐盛宴中&#xff0c;谁来保证演出的流畅与协调&#xff1f;答案就是——前端控制器模式&#xff01;它如同乐队的指挥&#xff0c;…

unaipp推荐算法的汽车租赁系统zaxzu 微信小程序hbuiderx

随着现代汽车租赁管理的快速发展&#xff0c;可以说汽车租赁管理已经逐渐成为现代汽车租赁管理过程中最为重要的部分之一。但是一直以来我国传统的汽车租赁管理并没有建立一套完善的行之有效的汽车租赁管理系统&#xff0c;传统的汽车租赁管理已经无法适应高速发展&#xff0c;…

python3安装教程

1.下载python 百度网盘下载python-3.12.3-amd64.exe 链接&#xff1a;https://pan.baidu.com/s/1MV3kvVdjCdS_G-_KgefwLw?pwdpgzu 提取码&#xff1a;pgzu 官网下载&#xff1a;Welcome to Python.org 有很多版本&#xff0c;选择需要的版本下载 2.安装python 双击python-…

静态分配IP,解决本地连接不上Linux虚拟机的问题

在Window环境下&#xff0c;使用远程终端工具连接不了VMware搭建的Linux虚拟机&#xff08;CentOS 7&#xff09;&#xff0c;并且在命令行ping不通该Linux虚拟机的IP地址。下面通过配置网关解决本地与Linux虚拟机连接问题&#xff1a; 1 查看虚拟机网关地址 在VMware虚拟机上…

鸿蒙开发-ArkTS语言-容器-非线性容器

鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…

Angular中组件之间的传值

Angular中组件之间的传值 文章目录 Angular中组件之间的传值前言一、父亲向儿子传值二、儿子向父亲传值三、爷爷向孙子传值四、兄弟之间的传值 前言 Angular的组件是构成应用的基础单元&#xff0c;它们封装了HTML模板、TypeScript代码以及CSS样式&#xff0c;以实现特定的功能…

2024蓝桥杯CTF writeUP--packet

根据流量分析&#xff0c;我们可以知道129是攻击机&#xff0c;128被留了php后门&#xff0c;129通过get请求来获得数据 129请求ls Respons在这 里面有flag文件 这里请求打开flag文件&#xff0c;并以base64编码流传输回来 获得flag的base64的数据 然后解码 到手

产品推荐 | 基于 Virtex UltraScale+ XCVU3P的FACE-VPXSSD-3PA 存储板

01 产品概述 FACE&#xff08;FPGA Algorithm aCceleration Engine&#xff09;FPGA算法加速开发引擎是基于FPGA可编程器件构建的一系列算法加速开发引擎平台。FACE-VPXSSD-3PA存储平台是FACE系列中的一员。该平台板载2组2GB 64bit DDR4、2路QSFP28光接口、4个NVME SSD M.2接口…

Elasticsearch的基本使用

Elasticsearch的基本使用 1.基本概念1.1 文档和字段1.2 索引和映射1.3 mysql与elasticsearch对比 2.索引库2.1 es中mapping映射属性2.2.es中索引库的增删改查 3.文档3.1 新增文档3.2 查询文档3.3 删除文档3.4 修改文档3.4.1 全量修改3.4.2 增量修改3.5 总结 4.DSL查询语法4.1 D…

如何提高日语听力?日语学习日语培训柯桥小语种学校

每次一说起练日语听力&#xff0c;总离不开一个词&#xff0c;那就是“磨耳朵”。 可是&#xff0c;“磨耳朵”真的有用吗&#xff1f; 在讨论这个问题之前&#xff0c;我们需要先知道&#xff1a;什么是“磨耳朵”&#xff1f; 所谓的“磨耳朵”&#xff0c;其实就是让我们的耳…

数据结构===二叉树

文章目录 概要二叉树的概念分类存储遍历前序中序后序 小结 概要 简单写下二叉树都有哪些内容&#xff0c;这篇文章要写什么 二叉树的概念分类&#xff0c;都有哪些二叉树遍历 对一个数据结构&#xff0c;最先入手的都是定义&#xff0c;然后才会有哪些分类&#xff0c;对二叉…

LVS 负载均衡部署 NAT模式

一、环境准备 配置环境&#xff1a; 负载调度器&#xff1a;配置双网卡 内网&#xff1a;172.168.1.11(ens33) 外网卡&#xff1a;12.0.0.1(ens37)二台WEB服务器集群池&#xff1a;172.168.1.12、172.168.1.13 一台NFS共享服务器&#xff1a;172.168.1.14客户端&#xff…

爬虫爬取必应和百度搜索界面的图片

爬虫爬取必应和百度搜索界面的图片 爬取bing搜索图片界面爬取百度搜索界面图片结果如下 爬取bing搜索图片界面 浏览器驱动下载地址 对应版本即可 浏览器驱动 mad直接用 import os import re from selenium import webdriver from selenium.webdriver import Keys from sel…

docker系列9:容器卷挂载(下)

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx docker系列6&#xff1a;docker安装redis docker系…

2024抖音小店还能做吗?值得开通吗?一文带你揭秘!

大家好&#xff0c;我是电商花花。 抖音小店已经出台了这么几年&#xff0c;很多人不禁发问2024年的抖音小店还能做吗&#xff1f;还有利润空间和机会吗&#xff1f; 按照我们做电商这么多年来的经验&#xff0c;一家抖音小店的电商行业风向来看&#xff0c;2024年的抖音小店…

释放创造力,低成本实现您的梦想应用 —— 尽在我们的开源低代码平台!

在数字化时代&#xff0c;每个企业都渴望拥有自己的专属应用&#xff0c;但传统开发模式的高成本和技术壁垒让许多梦想搁浅。现在&#xff0c;我们为您带来了革命性的解决方案 —— 一个开源、免费、且功能强大的低代码开发平台&#xff01; 为什么选择我们的低代码平台&#…

读天才与算法:人脑与AI的数学思维笔记22_中文房间

1. 华生的工作模式 1.1. 请你想象一个巨大的场景&#xff0c;其中有单词、名字和其他可能的答案&#xff0c;它们散布在各处 1.1.1. IBM所做的第一步是以某种连贯的方式排列单词 1.1.2. 第二步是理解每个问题&#xff0c;并为该问题生成候选位置标记 1.1.2.1. 爱因斯坦会演…

Day31:单元测试、项目监控、项目部署、项目总结、常见面试题

单元测试 保证独立性。 Assert&#xff1a;断言&#xff0c;一般用来比较是否相等&#xff0c;比如 Assert.assertEquals 在JUnit测试框架中&#xff0c;BeforeClass&#xff0c;Before&#xff0c;After和AfterClass是四个常用的注解&#xff0c;它们的作用如下&#xff1a; …

AI助力制造行业探索创新路径

近期&#xff0c;著名科技作家凯文凯利&#xff08;K.K.&#xff09;来到中国&#xff0c;发表了一场演讲,给广大听众带来了深刻的启示。他在演讲中强调了人工智能&#xff08;AI&#xff09;对全球经济的重大影响&#xff0c;并提出了AI发展的多个观点&#xff1a; AI的多样性…

【MATLAB源码-第50期】基于simulink的BPSK调制解调仿真,输出误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. Bernoulli Binary: 这个模块生成伯努利二进制随机数&#xff0c;即0或1。这些数字表示要传输的原始数字信息。 2. Unipolar to Bipolar Converter: 此模块将伯努利二进制数据从0和1转换为-1和1&#xff0c;这是BPSK调制的…