首页 > 其他分享 >234.回文链表

234.回文链表

时间:2024-11-28 16:31:26浏览次数:8  
标签:head ListNode 结点 next 链表 234 null 回文

回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表

如果是,返回 true ;否则,返回 false 。

示例 1:

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

示例 2:

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

提示:

  • 链表中节点数目在范围[1, 105] 内
  • 0 <= Node.val <= 9

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路:将链表前半部分反转,和链表后半部分比较

package hot100;


/***
 * 回文链表
 */
public class huiwen {

    /**
     * 反转链表函数
     *
     * @param head 传入单链表
     * @return
     */
    public ListNode reverse(ListNode head) {
        //反转之后的链表
        ListNode dummy = null;
        //node指向传入的需要反转的链表
        ListNode node = head;
        while (node != null) {
            //next 保存下一个结点
            ListNode next = node.next;
            //node指向dummy
            node.next = dummy;
            //dummy向前移动 指向node
            dummy = node;
            //将node指向next
            node = next;
        }
        //将反转后的链表返回
        return dummy;
    }

    /**
     * 具体逻辑
     * @param head
     * @return
     */
    public boolean isPalindrome(ListNode head) {
        //链表为空结点或者只有一个结点返回true
        if (head == null || head.next == null) {
            return true;
        }
        //用快慢指针找到链表中间结点
        ListNode slowNode = head;
        ListNode fastNode = head.next;
        while (fastNode.next != null && fastNode.next.next != null) {
            slowNode = slowNode.next;
            fastNode = fastNode.next.next;
        }
        //循环结束之后 slow到达链表中间结点[无论链表为奇数还是偶数]
        //循环结束之后 fast[奇数到达最后一个结点 这也就是后面为什么要分析奇数情况][偶数直接指向空结点]
        //slowSecond 支线链表后半部分的第一个结点
        ListNode slowSecond = slowNode.next;
        // 处理长度为奇数的情况 fast会停留在倒数第二个结点slowSecond应指向链表后半部分的第二个结点
        //例如:链表为 1 -> 2 -> 3 -> 2 -> 1,在fast和slow指针到达中间时,secondHalf应指向第二个2(即slow.next.next)
        if (fastNode.next != null) {
            slowSecond = slowNode.next.next;
        }
        //将链表的前半部分截断,确保链表的前后两部分分开
        slowNode.next = null;
        //判断两部分的连表是不是回文链表
        //1、第一部分 head被截断的前半部分: head
        //2、第二部分 slowSecond: 指向后半部分的第一个结点
        boolean isOrNot = equalsList(slowSecond, reverse(head));
        return isOrNot;
    }

    public boolean equalsList(ListNode nodeA, ListNode nodeB) {

        while (nodeA != null && nodeB != null) {
            if (nodeA.val == nodeB.val) {
                nodeA = nodeA.next;
                nodeB = nodeB.next;
            } else {
                return false;
            }
        }
        return true;

    }

}

时间复杂度 O(N)

空间复杂度O(1)

标签:head,ListNode,结点,next,链表,234,null,回文
From: https://blog.csdn.net/weixin_60205306/article/details/144114573

相关文章

  • 代码随想录 -- 动态规划 -- 最长回文子序列
    516.最长回文子序列-力扣(LeetCode)思路:dp数组的含义:dp[i][j]:字符串s从i到j的最长回文子序列的长度为dp[i][j]递推公式:当s[i]=s[j]时:dp[i][j]=dp[i+1][j-1]+2当s[i]!=s[j]时:dp[i][j]=max(dp[i][j-1],dp[i+1][j])初始化:当i=j时:dp[i][j]=1遍历顺序:从下到上,从左到右最......
  • P1217 [USACO1.5] 回文质数 Prime Palindromes
    标题:P1217[USACO1.5]回文质数PrimePalindromes链接:https://www.luogu.com.cn/problem/P1217思路:1.暴力枚举,超时2.回文和质数共同判断,超时3.数字通过strings=to_string(n);转化为字符串,超时+:字符串转为数字intx=stoi(n);4.找规律,有偶数位的回文数(除了11)必然不是质数......
  • 206. 删除链表的倒数第n个节点
    题目卡哥思路卡哥是用双指针来解题,我没想出来这个思路。精华部分:双指针的经典应用,如果要到达倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾(nullptr)。slow所指向的节点就是倒数第n个节点。跟着卡哥代码敲了下:/***Definitionforsingly-linked......
  • LeetCode21 合并两个有序链表
    LeetCode21合并两个有序链表题目链接:LeetCode21描述将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]思路方法一:迭代遍历两个列表,逐一比较时间复杂度:O(n+m)......
  • 【快慢指针技巧】:高效解决链表和数组问题(26,83,27)
    ......
  • 最长回文字串习题分析
    习题:(leetcode5)给你一个字符串 s,找到 s 中最长的 回文子串。回文字串:子字符串 是字符串中连续的 非空 字符序列。分析:可以先创建一个回文判断函数(isPalindrome),对于一个回文字串将第一个元素和最后一个元素删去后剩余的字串仍是回文字串。使用双重循环进行遍历,找到......
  • 24. 两辆交换链表中的节点
    题目卡哥的讲解很详细了卡哥视频讲解一如既往的把小细节都讲到了跟着卡哥的代码敲了下/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val......
  • LeetCode234 回文链表
    LeetCode234回文链表题目链接:LeetCode描述给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例输入:head=[1,2,2,1]输出:true输入:head=[1,2]输出:false方法一思路首先找到链表的中间结点mid:如果链表有奇数个节......
  • C进阶 结构体与链表
    文章目录一,回顾一点结构体与指针二,结构体怎么与链表联系在一起三,链表的头插法和尾插法四,删除特定的节点和插入特定的节点(虚拟头结点实现)前言这里讲述的是链表与结构体的关系,把两个联系在一起可以很好的把杂乱的数据通过链表联系在一起,这样可以更加便利去修改数据和维护......
  • Swift 实现链表重新排列:L0 → Ln → L1 → Ln-1
    前言本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。143.重排链表不积跬步,无以至千里;不积小流,无以成江海,Swift社区伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。难度水平:中等摘要链表的重新排列是链表操作的......