当前位置: 首页 > article >正文

【算法萌新闯力扣】:回文链表

    力扣题目:回文链表

开篇

  今天是备战蓝桥杯的第23天。我加入的编程导航算法通关村也在今天开营啦!那从现在起,我的算法题更新会按照算法村的给的路线更新,更加系统。大家也可以关注我新开的专栏“算法通关村”。里面会有更全面的知识点和题目的分享。

题目链接: 234.回文链表

题目描述

在这里插入图片描述

代码思路1

1.一开始写的时候,感觉在链表里操作太麻烦了,就利用list集合把链表里的元素存起来,然后在链表里判断就行(也可以放数组里)
2.既然存在集合里,那回文数的判断就轻轻松松喽。这里我使用左右指针,一个在头,一个在尾,两个指针同时往中间移动,只要有一次两个指针对应的数据不相等,则不是回文

代码纯享版

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        List<Integer> list = new ArrayList<>();
        ListNode node = head;
        while(node != null){
            list.add(node.val);
            node = node.next;
        }
        int left = 0, right = list.size() - 1;
        while(left < right){
            if(list.get(left) != list.get(right)) return false;
            left++;
            right--;
        }
        return true;
    }
}

代码逐行解析版

class Solution {
    public boolean isPalindrome(ListNode head) {
        List<Integer> list = new ArrayList<>(); //创建list集合
        ListNode node = head; //创建结点node指向头结点
        while(node != null){ //当node不为空时
            list.add(node.val); //将该结点添加到集合中
            node = node.next; //node指向下一个结点
        }
        int left = 0, right = list.size() - 1; //创建左右指针,分别指向集合到开头和结尾
        while(left < right){ //循环条件是两个指针相遇前
            if(list.get(left) != list.get(right)) return false; //两个指针对应的数如果不相等,则不是回文,返回false
            left++; //左指针右移
            right--; //右指针左移
        }
        return true;//没有false的情况,返回true
    }
}

代码思路2

上面第一种方法被算法村的讲义说是逃避链表,面试不能这样,只能含泪考虑其他思路。
第二种思路是利用栈后进先出的特点,先把整个链表压入栈中,然后同时遍历链表和输出栈顶元素,一一比较,不相同则不是回文数

代码纯享版

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
     public boolean isPalindrome(ListNode head) {
         Stack<Integer> stack = new Stack<>(); 
         ListNode node = head;
         while(node != null){
             stack.push(node.val);
             node = node.next;
         }
         node = head;
         while(node != null){
             if(stack.pop() != node.val) return false;
             node = node.next;
         }
         return true;
     }
}

代码逐行解析版

class Solution {
     public boolean isPalindrome(ListNode head) {
         Stack<Integer> stack = new Stack<>(); //创建一个栈
         ListNode node = head; //创建node结点指向头结点
         while(node != null){ //node不为空时
             stack.push(node.val);//把node结点的值压入栈中
             node = node.next; //node指向下一个结点
         }
         node = head; //node重新指向头结点
         while(node != null){ //node不为空时
             if(stack.pop() != node.val) return false; //栈顶元素出栈,如果栈顶元素与node结点的值不相等,返回false
             node = node.next; //node指向下一个结点
         }
         return true;//没有false的情况,返回true
     }

}

结语

 如果这道题的分享对您有所帮助,点个关注,我会每天更新力扣题的讲解,与大伙儿一起向前迈进!


http://www.kler.cn/a/146812.html

相关文章:

  • Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失
  • 闫氏DP分析法应用
  • 记录java Collections.sort踩的坑
  • 【git】git取消提交的内容,恢复到暂存区
  • ks 小程序sig3
  • DataStream编程模型之数据源、数据转换、数据输出
  • 前端实现埋点
  • 前端铜九铁十面试必备八股文——性能优化
  • C#,《小白学程序》第九课:堆栈(Stack),先进后出的数据型式
  • Git设置多个仓库同时推送
  • 【实时渲染】图形渲染管线
  • codeformer,是如何对数据进行降级处理的?是如何模糊人脸图像的?
  • quickapp_快应用_全局数据
  • Open Feign 源码解析(四) --- 请求对象构造(上)
  • 【Qt】判断QList链表内是否有重复数据
  • 微服务系列(三)--通过spring cloud zuul过滤器实现线上流量复制
  • 系统架构设计:8 论软件架构风格
  • mycat快速搭建
  • 微信小程序开发学习——小程序基本架构
  • 【设计模式-2.1】创建型——单例模式
  • HTML CSS登录网页设计
  • torch.nn.batchnorm1d,torch.nn.batchnorm2d,torch.nn.LayerNorm解释:
  • 数据结构总复习
  • React中通过children prop或者React.memo来优化子组件渲染【react性能优化】
  • scala 实现表达式解析
  • 在UE中使用C++时的Pascal命名法