链表之回文链表

在这里插入图片描述
https://leetcode.cn/problems/kth-node-from-end-of-list-lcci
思路:先通过快慢指针找出中心点,然后中心点之后的节点链表反转,再通过头部和尾部,逐渐向中间遍历,相遇则结束(注意偶数节点个数),因为中心点之后的链表实际上是环状,偶数没法相遇只能通过 left.next = right 来判断结束
在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3ff48e83632a4360b99ad1d4fdf97e81.png

  • 注意偶数:出现如下情况,需要加一个判断条件left.next = right ,不能光是 left 和 right 相遇,

在这里插入图片描述

class Solution {
    public boolean isPalindrome(ListNode head) {
          if(head == null || head.next == null){
            return true;
        }
      
        // write code here
        ListNode fast = head;
        ListNode slow = head;
        //快慢指针判断中间值
        while(fast != null && fast.next != null){
            //快指针走两步
            fast  = fast.next.next;
            //快指针走两步
            slow = slow.next;
        }
      //cur指向中间值下一个节点
      //slow中间值
        ListNode cur = slow.next;
        while(cur != null){
            //curNext指向cur的下一个节点
            ListNode curNext = cur.next;
            //让cur.next指向slow
            cur.next = slow;
            //slow移到cur位置
            slow = cur;
            //cur移到curNext位置
            cur = curNext;
        }
        //定义左指针
        ListNode left = head;
        //定义右指针
        ListNode right = slow;
        //相遇时停止
        while(left != right){
            //不相等不是回文数
            if(left.val != right.val){
                return false;
            }
            //注意偶数情况,偶数没法相遇,针对偶数进行判定
            //不能放到比较值前面,应该先比较值,在比较节点
            if(left.next == right){
                return true;
            }
            //右移
            left = left.next;
            //左移
            right = right.next;
        }
        //返回true
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值