面试热题(回文链表)

这篇具有很好参考价值的文章主要介绍了面试热题(回文链表)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

面试热题(回文链表),热题Hot100,面试,链表,java

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

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

  • 字符串化比较

面试热题(回文链表),热题Hot100,面试,链表,java

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());}

面试热题(回文链表),热题Hot100,面试,链表,java

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

面试热题(回文链表),热题Hot100,面试,链表,java面试热题(回文链表),热题Hot100,面试,链表,java 

 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;
    }

面试热题(回文链表),热题Hot100,面试,链表,java

  • 中点翻转对比

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

面试热题(回文链表),热题Hot100,面试,链表,java面试热题(回文链表),热题Hot100,面试,链表,java

  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. 将中心点后面的链表进行翻转
    面试热题(回文链表),热题Hot100,面试,链表,java
    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;
    }

面试热题(回文链表),热题Hot100,面试,链表,java

 

  • 双端队列

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

面试热题(回文链表),热题Hot100,面试,链表,java

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

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

面试热题(回文链表),热题Hot100,面试,链表,java

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

 链表的节点为偶数时:

 面试热题(回文链表),热题Hot100,面试,链表,java

 链表的节点为偶数时:

面试热题(回文链表),热题Hot100,面试,链表,java

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

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

面试热题(回文链表),热题Hot100,面试,链表,java

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

面试热题(回文链表),热题Hot100,面试,链表,java

 

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

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;
    }

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

面试热题(回文链表),热题Hot100,面试,链表,java

       测试的结果都是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];
    }

面试热题(回文链表),热题Hot100,面试,链表,java

       这几种方式已经全部介绍结束,希望大家做题的时候,不要死记住一种解法去解决问题,多思考别的方式,拓宽自己的思路,不局限于一种解法文章来源地址https://www.toymoban.com/news/detail-646981.html

到了这里,关于面试热题(回文链表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数

    本期给大家带来的是是《 LeetCode 热题 HOT 100 》第四题—— 寻找两个正序数组的中位数的 题目讲解 !!!() 本文目录 💥题意分析 💥解题思路: 1、直接法  (❌) 2、归并思想 (❌) ①《LeetCode》第88题——合并两个有序数组 3、二分查找(✔️) 整体思想: 题目如下

    2023年04月27日
    浏览(43)
  • LeetCode热题100——链表

    给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回

    2024年02月05日
    浏览(43)
  • LeetCode 热题 100 | 链表(上)

    目录 1  基础知识 1.1  空指针 1.2  结构体 1.3  指针访问 1.4  三目运算符 2  160. 相交链表 3  206. 反转链表 4  234. 回文链表 菜鸟做题第三周,语言是 C++ 1  基础知识 1.1  空指针 使用 nullptr 来判断是否为空指针: “NULL 在 C++ 中就是 0,这是因为在 C++ 中 void* 类型是不允许隐式

    2024年02月19日
    浏览(41)
  • LeetCode 热题100——链表专题

    2.俩数相加(题目链接) 思路:这题题目首先要看懂,以示例1为例  即  342+465=807,而产生的新链表为7-0-8. 可以看成简单的从左向右,低位到高位的加法运算,4+6=10,逢10进1,新链表第三位为3+4+1(第二位进的1),需要注意的的点是当9-9-9和9-9-9-9相加,相当于9-9-9-0和9-9-9-9相加

    2024年02月05日
    浏览(36)
  • LeetCode热题HOT100:76. 最小覆盖子串,84.柱状图中最大的矩形、96. 不同的二叉搜索树

    题目 :给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保

    2023年04月19日
    浏览(69)
  • LeetCode 热题100——链表专题(一)

    2.俩数相加(题目链接) 思路:这题题目首先要看懂,以示例1为例  即  342+465=807,而产生的新链表为7-0-8. 可以看成简单的从左向右,低位到高位的加法运算,4+6=10,逢10进1,新链表第三位为3+4+1(第二位进的1),需要注意的的点是当9-9-9和9-9-9-9相加,相当于9-9-9-0和9-9-9-9相加

    2024年02月03日
    浏览(42)
  • 【LeetCode热题100】【链表】两两交换链表中的节点

    题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 实际上是两个两个一组颠倒顺序,可以用k=2使用【LeetCode热题100】【链表】K 个一组翻转链表-CSDN博客 但可以更简单,就先看两个,先取第二个的指针,递归颠倒第二个后面的节点,链接到第一个节点上,然后把第一个节

    2024年04月13日
    浏览(80)
  • 【2023】LeetCode HOT 100——链表

    2023年08月31日
    浏览(40)
  • 力扣HOT100 - 160. 相交链表

    解题思路:

    2024年04月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包