【代码题】五道链表面试题

news/2024/11/7 23:50:19/

目录

1.移除链表元素

2.反转链表

 3.链表的中间结点

 4.链表中倒数第k个结点

 5.合并两个有序链表


1.移除链表元素

点击进入该题

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。

 

 思路:

  1. 既然需要删除val,那么我们要做的一定有找到val值这个操作。
  2. 因为是单链表,无法返回到上一个节点,因此我们需要使用双指针。
  3. 进入while,寻找val,如果找到就将val删除(prev.next=cur.next),删除后,只让cur向后走,因为我们找到的下一个值也可能是val值。如果没有找到,就让prev和cur都向后走一步。
  4. 上方判断跳过了头节点,拿出来单独判断。
  5. 最终返回head。

代码: 

   public ListNode removeElements(ListNode head, int val) {//判断链表是否为空if(head==null) {return null;}//双指针思想ListNode cur=head.next;ListNode prev=head;while(cur!=null) {//删除if(cur.val==val) {prev.next=cur.next;cur=cur.next;  }else{prev=cur;cur=cur.next;}}//判断第一个是否为keyif(head.val==val) {head=head.next;}return head;}

2.反转链表

点击进入该题

 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

思路:

  1. 先判断特殊情况,无节点和一个节点的情况。
  2. 用cur向后走,用curNext记录cur下一个节点。
  3. 运用头插法将cur一个一个插入到heda前面

 

代码: 

public ListNode reverseList(ListNode head) {//无节点情况if(head==null){return null;}//一个节点情况if(head.next==null) {return head;}ListNode cur=head.next;head.next=null;//头插法while(cur!=null) {ListNode curNext=cur.next;cur.next=head;head=cur;cur=curNext;}return head;}

 3.链表的中间结点

 点击进入该题

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

思路:

  1. 此题运用了,在相同时间和相同路程中,V2是V1的二倍,那么,V2走到最后,V1就刚好走到中间。
  2. 运用双指针、快慢指针思想。
  3. 让prev走两步,让cur走一步,当prev走到尾节点时,cur刚好在中间节点。

 

public ListNode middleNode(ListNode head) {// 双指针/快慢指针ListNode cur=head;ListNode prev=head;//prev和prev的后一个都不能为空while(prev!=null&&prev.next!=null){prev=prev.next.next;cur=cur.next;}return cur;}

 4.链表中倒数第k个结点

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

点击进入该题 

思路:

  1. 倒数第k个结点是链表的长度减k再加1.
  2. 判断特殊情况,head为空,给的k大于链表长度,此时的结果都是null
    public ListNode FindKthToTail(ListNode head,int k) {if(head==null) {return null;}int len=0;ListNode cur=head;while(cur!=null) {cur=cur.next;len++;}if(k>len) {return null;}int z=len-k;cur=head;while(z!=0) {cur=cur.next;z--;}return cur;}

 5.合并两个有序链表

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

点击进入此题

 思路:

  1. 定义一个头结点,比较两个链表结点的值,进行尾插。
  2. 当两个链表任意一个到尾时,停止比较,直接将不为零的链表直接加入到我们合并的链表后面。
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {//判断两个链表是否有空?if(list1==null) {return list2;}if(list2==null) {return list1;}//确认头结点ListNode head=(list1.val>list2.val)?list2:list1;//是头结点,需要向后走一步if(head==list1){list1=list1.next;}else{list2=list2.next;}ListNode cur=head;//比较大小,开始尾插while(list1!=null&&list2!=null) {if(list1.val<=list2.val) {cur.next=list1;list1=list1.next;cur=cur.next;}else{cur.next=list2;list2=list2.next;cur=cur.next;}}//插入另一个链表剩余的部分cur.next=list1==null?list2:list1;return head;}


http://www.ppmy.cn/news/9065.html

相关文章

WebSocket实现聊天室

需求 实现用户登录功能展示用户好友列表功能实现用户历史消息展示实现单聊信息和群聊信息 效果展示 用户登录 好友列表展示 历史消息展示 聊天 代码实现 说明&#xff1a;Springboot项目&#xff0c;页面是用 thymeleaf 整合的。 maven依赖 <dependencies><depen…

常见服务及其安全漏洞浅析(二)

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是常见服务及其安全漏洞浅析。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

在线问诊呈爆发式增长,聚合支付分账如何助力互联网医疗平台加速发展?

&#xff08;图源:pexels网站&#xff09; 随着疫情的放开&#xff0c;人们问诊需求快速上涨&#xff0c;由于医院服务的压力激增&#xff0c;线上问诊成为了不少人替代去医院的有效手段&#xff0c;甚至于线上问诊开始出现了爆发式增长。但是在互联网医疗平台的发展过程中&am…

Python调用C++代码用法——Linux

目录 前言 C/C动态共享库编译 ctype模块 ctype数据类型 使用案例 float数据 指针 输出数组 结构体及结构体指针 numpy图像当作指针传入 参考资料 前言 在项目开发中&#xff0c;有时会使用到多种编程语言&#xff0c;比如部分功能是C/C代码实现的&#xff0c;而另一部…

OBS 进阶 音频面板优化

因为,面板高度就那么大,如果声音源很多的话,就有点乱。 优化目的:静音的,自动放在底部,这样,音频面板上面的都是没有静音的,也是我们最关注的部分。 目录 一、音频面板优化 1、不想要音频面板的title,将其去掉

九、动态组件与插槽

一、动态组件 1.1、什么是动态组件 动态组件指的是动态切换组件的显示与隐藏。 1.2、如何实现动态组件渲染 vue提供了一个内置的<component>组件&#xff0c;专门用来实现动态组件的渲染。示例代码如下&#xff1a; data() {// 1. 当前要渲染的组件名称return {comN…

rabbitmq+netcore6 【2】Work Queues:一个生产者两个消费者

文章目录1&#xff09;准备工作2&#xff09;新建消费者13&#xff09;新建消费者24&#xff09;生产者5&#xff09;知识点解读1、autoAck: true2、重复声明/前后不一致3、Message durability 消息持久化4、Fair Dispatch 公平调度5、综合以上知识点的代码&#xff1a;官网参考…

什么是堡垒机?为什么需要堡垒机?

文章目录什么是堡垒机为什么需要堡垒机堡垒机的设计理念堡垒机的目标堡垒机的价值堡垒机的原理什么是堡垒机 堡垒机&#xff0c;即在一个特定的网络环境下&#xff0c;为了保障网络和数据不受来自外部和内部用户的入侵和破坏&#xff0c;而运用各种技术手段监控和记录运维人员对…