面试热题(回文链表)

给定一个链表的 头节点 head ,请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

       回文链表类似于回文串,正读倒读的顺序是一样的,那么我们怎么去判断一个链表是否是回文链表呢?

今天我们用多种方法、多种角度去思考问题,带你领略算法的奥秘

  • 字符串化比较

public boolean isPalindrome(ListNode head) {if(head==null){return false;}//一般通过StringBuilder进行字符操作StringBuilder s1=new StringBuilder();StringBuilder s2=new StringBuilder();//通过while循环将链表中的节点添加到字符串中while(head!=null){s1.append(head.val);s2.append(head.val);head=head.next;}//将s2进行翻转s2.reverse();return s1.toString().equals(s2.toString());}

       通过维护一个栈去保存链表中的节点,栈是先进后出的数据结构,这样也可以做到使得链表进行翻转,然后与原链表进行对比,得出正确的结果

 

 public boolean isPalindrome(ListNode head) {ListNode cur1=head;ListNode cur2=head;Stack<ListNode> stack=new Stack<>();while(cur1!=null){stack.add(cur1);cur1=cur1.next;}while(cur2!=null&&!stack.isEmpty()){ListNode curNode=stack.pop();if(curNode.val!=cur2.val){return false;}cur2=cur2.next;}return true;}

  • 中点翻转对比

 链表为偶数时:                                                           链表为奇数时:

  1.  通过快慢指针找到链表的中心点
    public ListNode findMid(ListNode head){ListNode fast=head;ListNode slow=head;//快慢指针,快走两步,慢走一步,最后slow的位置就是链表的中心点while(fast.next!=null&&fast.next.next!=null){fast=fast.next.next;slow=slow.next;}return slow;}
  2. 将中心点后面的链表进行翻转
    public ListNode reverseList(ListNode head){if(head==null){return head;}//前驱ListNode pre=null;//当前节点ListNode cur=head;//后继ListNode next=null;while(cur!=null){next=cur.next;cur.next=pre;pre=cur;cur=next;}//返回前驱return pre;}
  3. 判断前半段链表和后半段链表是否相等
    public boolean isSame(ListNode l1,ListNode l2){ListNode p1=l1;ListNode p2=l2;//这里只能判断p2,因为p1d的话,它上半段遍历完,它会接着遍历下半段while(p2!=null){if(p1.val!=p2.val){return false;}p1=p1.next;p2=p2.next;}return true;}

 源码:

public boolean isPalindrome(ListNode head) {if(head==null){return true;}ListNode mid=findMid(head);ListNode l1=head;ListNode l2=mid.next;l2=reverseList(l2);return isSame(l1,l2);}public ListNode findMid(ListNode head){ListNode fast=head;ListNode slow=head;while(fast.next!=null&&fast.next.next!=null){fast=fast.next.next;slow=slow.next;}return slow;}public ListNode reverseList(ListNode head){if(head==null){return head;}ListNode pre=null;ListNode cur=head;ListNode next=null;while(cur!=null){next=cur.next;cur.next=pre;pre=cur;cur=next;}return pre;}public boolean isSame(ListNode l1,ListNode l2){ListNode p1=l1;ListNode p2=l2;while(p2!=null){if(p1.val!=p2.val){return false;}p1=p1.next;p2=p2.next;}return true;}

 

  • 双端队列

通过维护一个双端队列去进行操作,所谓的双端队列就是可以从队尾进,也可以从队头进

 while(head!=null){queue.addLast(head);head=head.next;}

       将链表中的元素都塞入双端队列中,结束后,同时从队头队尾取节点,判断是否相等(相当于反向双指针)

          ListNode h=queue.removeFirst();ListNode t=queue.removeLast();if(h.val!=t.val){return false;}

 链表的节点为偶数时:

 

 链表的节点为偶数时:

 所以循环的结束条件则为:

while(queue.size()>1){...
}

  • 递归(链表递归相互奔向)

 

       递归到最后一个结点直接返回,与当前节点比较,如果相等,当前节点往后移动一位,递归再返回,这种就可以做到从两边进行比较

private void dfs(ListNode head, ListNode phead, boolean res) {if (head == null || !res) {return;}dfs(head.next, phead, res);if (head.val != phead.val) {res = false;}phead = phead.next;  }public boolean isPalindrome(ListNode head) {boolean res = true;ListNode phead = head;dfs(head, phead, res);return res;}

你们觉得这个代码有问题么?

       测试的结果都是true,说明我们这个过程并没有改变我们res的默认值,因为我们的java是值传递,并不是引用传递,所以并不会改变我们的值,所以我们需要将res、遍历的节点分别封装成一个对象进行传递

 private void dfs(ListNode head, ListNode[] phead, boolean[] res) {if (head == null || !res[0]) {return;}dfs(head.next, phead, res);if (head.val != phead[0].val) {res[0] = false;}phead[0] = phead[0].next;}public boolean isPalindrome(ListNode head) {boolean[] res = {true};ListNode[] phead = {head};dfs(head, phead, res);return res[0];}

       这几种方式已经全部介绍结束,希望大家做题的时候,不要死记住一种解法去解决问题,多思考别的方式,拓宽自己的思路,不局限于一种解法

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

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

相关文章

书单背景图片素材哪里找?这个工具赶紧用起来

好的文案是很重要的&#xff0c;但是如何找到好的文案却是一件很困难的事情。以下是一些可以寻找好的文案的方法分析&#xff0c;以及如何把书单文章转到视频的操作分享。 1.书籍和杂志&#xff1a;阅读关于广告、营销、文案和创意的书籍和杂志可以帮助你了解不同的文案类型和风…

【创作纪念日】我的2周年创作纪念日

创作者的探索与共鸣&#xff1a;用文字创造无限可能 在这特别的时刻&#xff0c;我想对你们说几句话。首先&#xff0c;我衷心感谢你们对我的支持和鼓励。正是因为你们的存在和关注&#xff0c;我才能够坚持不懈地创作和分享。 每一次写作都是一次心灵的倾诉和思想的交流。无论…

【Linux】创建普通用户以及Linux问题解决

创建普通用户 ❓可以看到我们现在是一个root用户&#xff0c;并不是一个普通用户&#xff0c;我们要如何创建普通用户呢&#xff1f; adduser 你的用户名passwd 你的用户名&#x1f525;注意这里passwd设置密码的时候&#xff0c;你输入密码电脑不会显示 删除普通用户 userd…

即将发布的 Kibana 版本可运行 Node.js 18

作者&#xff1a;Thomas Watson Kibana 构建在 Node.js 框架之上。 为了确保每个 Kibana 版本的稳定性和使用寿命&#xff0c;我们始终将捆绑的 Node.js 二进制文件保持为最新的最新长期支持 (LTS) 版本。 当 Node.js 版本 18 升级到 LTS 时&#xff0c;我们开始将 Kibana 升级…

uniapp开发小程序-有分类和列表时,进入页面默认选中第一个分类

一、效果&#xff1a; 如下图所示&#xff0c;进入该页面后&#xff0c;默认选中第一个分类&#xff0c;以及第一个分类下的列表数据。 二、代码实现&#xff1a; 关键代码&#xff1a; 进入页面时&#xff0c;默认调用分类的接口&#xff0c;在分类接口里做判断&#xff…

O2OA (翱途) o2server 调用 webServices jaxws 样例

本文分两部分介绍如何在 o2server 服务器中调用 webServices(jaxws)服务. 第一部分介绍如何在tomcat上搭建一个webServices(jaxws)服务. 第二部分介绍如何在o2server服务器上来调用上面创建的服务. O2OA (翱途)官网&#xff1a;http://www.o2oa.net 一、在tomcat上搭建一个…

TransNetR:用于多中心分布外测试的息肉分割的基于transformer的残差网络

TransNetR Transformer-based Residual Network for Polyp Segmentation with Multi-Center Out-of-Distribution Testing 阅读笔记 1. 论文名称 《TransNetR Transformer-based Residual Network for Polyp Segmentation with Multi-Center Out-of-Distribution Testing》 用…

考虑分布式电源的配电网无功优化问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

WebApIs 第五天

window对象 BOM&#xff08;浏览器对象模型&#xff09;定时器-延时函数JS执行机制location对象navigator对象histroy对象 本地存储 一.BOM&#xff08;浏览器对象模型&#xff09; ① BOM是浏览器对象模型 window 对象是一个全局对象&#xff0c;也可以说是JavaScript中的…

LangChain-ChatGLM在WIndows10下的部署

LangChain-ChatGLM在WIndows10下的部署 参考资料 1、LangChain ChatGLM2-6B 搭建个人专属知识库中的LangChain ChatGLM2-6B 构建知识库这一节&#xff1a;基本的逻辑和步骤是对的&#xff0c;但要根据Windows和现状做很多调整。 2、没有动过model_config.py中的“LORA_MOD…

微服务Ribbon-负载均衡策略和饥饿加载

目录 一、负载均衡策略 1.1 负载均衡策略介绍 1.2 自定义负载均衡策略 二、饥饿加载 &#xff08;笔记整理自bilibili黑马程序员课程&#xff09; 一、负载均衡策略 1.1 负载均衡策略介绍 负载均衡的规则都定义在IRule接口中&#xff0c;而IRule有很多不同的实现类&…

2023-arxiv-LLaMA: Open and Efficient Foundation Language Models

开放和高效的基础语言模型 Paper&#xff1a;https://arxiv.org/abs/2302.13971 Code: https://github.com/facebookresearch/llama 摘要 本文介绍了 LLaMA&#xff0c;这是⼀个包含 7B 到 65B 参数的基础语⾔模型的集合。作者在数万亿个令牌上训练模型&#xff0c;并表明可以…