首页 > 其他分享 >LeetCode234 回文链表

LeetCode234 回文链表

时间:2024-11-26 17:48:13浏览次数:6  
标签:head LeetCode234 ListNode cur next 链表 null 回文

LeetCode234 回文链表

题目链接:LeetCode

描述

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例

输入:head = [1,2,2,1]
输出:true

输入:head = [1,2]
输出:false

方法一

思路

首先找到链表的中间结点 mid:

  • 如果链表有奇数个节点,那么找的是正中间的节点。

  • 如果链表有偶数个节点,那么找的是正中间右边的节点。

然后反转从 mid 到链表末尾的这段,其头节点记作 head2。

最后,同时遍历 head 和 head2

代码

class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode mid = findMid(head);
        ListNode head2 = reverse(mid);
        while(head2 != null){
            if(head.val != head2.val){
                return false;
            }
            head = head.next;
            head2 = head2.next;
        }
        return true;
    }

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

    public ListNode reverse(ListNode head){
        ListNode pre = null;
        ListNode cur = head;
        ListNode temp = null;
        while(cur!=null){
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

方法二

思路

使用栈和队列来存储列表,然后遍历比较

代码

class Solution {
    public boolean isPalindrome(ListNode head) {
        Deque<ListNode> deque = new LinkedList<>();
        Queue<ListNode> queue = new LinkedList<>();
        ListNode cur = head;
        while(cur != null){
            deque.offerFirst(cur);
            queue.offer(cur);
            cur = cur.next;
        }
        while(!deque.isEmpty()){
            ListNode node1 = deque.pollFirst();
            ListNode node2 = queue.poll();
            if(node1.val != node2.val){
                return false;
            }
        }
        return true;
    }
}

标签:head,LeetCode234,ListNode,cur,next,链表,null,回文
From: https://www.cnblogs.com/dwhere/p/18570650

相关文章

  • C进阶 结构体与链表
    文章目录一,回顾一点结构体与指针二,结构体怎么与链表联系在一起三,链表的头插法和尾插法四,删除特定的节点和插入特定的节点(虚拟头结点实现)前言这里讲述的是链表与结构体的关系,把两个联系在一起可以很好的把杂乱的数据通过链表联系在一起,这样可以更加便利去修改数据和维护......
  • Swift 实现链表重新排列:L0 → Ln → L1 → Ln-1
    前言本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。143.重排链表不积跬步,无以至千里;不积小流,无以成江海,Swift社区伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。难度水平:中等摘要链表的重新排列是链表操作的......
  • 【数据结构】双向链表、单向循环链表、双向循环链表、栈、链栈
    目录一、双向链表定义类和封装函数以及测试样例如下:注意事项:二、循环链表单循环列表的类和函数封装如下:注意事项: 三、双向循环链表结点类和双循环链表的定义部分函数封装之判空和尾插双循环链表遍历双循环链表尾删完整测试以及结果:四、栈顺序栈顺序栈本质以及......
  • LeetCode24 两两交换链表中的节点
    LeetCode24两两交换链表中的节点题目链接:LeetCode24描述给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例输入:head=[1,2,3,4]输出:[2,1,4,3]思路代码classSolution{publicListNodeswapPairs(ListNodehead){ListNodedummy=......
  • 206. 反转链表
    题目自己一开始的思路是对链表的每个节点的val进行更改,然后就没有然后了……没写出来然后看了卡哥的讲解感触最深的点是卡哥是让结点间的指向发生改变(换句话说,改变了节点的next),然后顺着这个思路卡哥给出了两个方法:双指针法和递归法。特别要给卡哥的视频讲解点个大大的赞,所有......
  • 数据结构第二章双链表的相关操作
    带头结点的双链表的实现以及一系列操作#include<stdio.h>#include<stdlib.h>//定义双链表节点结构体typedefstructDNode{intdata;structDNode*prior;structDNode*next;}DNode,*DLinkList;//初始化双链表voidInitList(DLinkList&L){......
  • LeetCode19 删除链表的倒数第 N 个结点
    LeetCode19删除链表的倒数第N个结点题目链接:LeetCode19描述给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]思路定义fast指针和slow指针,初始值为虚拟头结点fast首先走n+1步fast和slow同时移动,直......
  • 【剑指Offer刷题系列】两个单链表相交的起始节点
    问题描述给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。自定义评测:......
  • 蓝桥杯c++算法学习【5】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷
     别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! ! !!!关注博主,更多蓝桥杯nice题目静待更新:)枚举与模拟一、卡片:【问题描述】        小蓝有很多数字卡片,每张卡片上都是一个数字(0到9)。         小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数......
  • 707. 设计链表
    题目这题卡哥的讲解视频特别好,涵盖了很多细节。自己跟着卡哥代码敲了一遍。单链表:classMyLinkedList{public:structLinkedNode{intval;LinkedNode*next;LinkedNode(intval):val(val),next(nullptr){}};MyLinkedList()......