算法之链表回文链表判断

问题描述

编写一个函数,检查输入的链表是否是回文的。

示例:

输入: 1->2
输出: false
输入: 1->2->2->1
输出: true

方法一

   /**
     * 要求时间复杂度为O(n),空间复杂度为O(1)
     *1.获取中间位置
     *  获取中间位置,可以通过快慢指针实现
     *2.从中间位置一次向两侧对比
     *  从中间向两侧对比,需要将左半部分进行翻转,才能够实现
     */
    public boolean isPalindrome(ListNode head) {
    
    
        if(head==null){
    
    
            return true;
        }
        //1.获取中间位置
        //获取中间位置,可以通过快慢指针实现
        ListNode slow = head;
        ListNode fast = head;
        //左侧链表翻转后的头部
        ListNode pre = null;
        while(fast!=null&&fast.next!=null){
    
    
            fast = fast.next.next;
            //记录下一个节点
            ListNode tmpNextForSlow = slow.next;
            //slow结点针对于pre是头部插入
            slow.next = pre;
            pre = slow;
            //将slow指向下一个结点
            slow = tmpNextForSlow;
        }

        ListNode right;
        //判断当前的链表长度是奇数还是偶数
        //1->2->3 如果fast有值,则为奇数长度.pre 指向1 ,slow指向2,那么需要right指向3即可
        //1->2->3->4 如果fast有值,则为奇数长度.pre 指向2,slow指向3,那么需要right=slow即可
        if(fast!=null){
    
    
            right = slow.next;
        }else{
    
    
            right = slow;
        }
        //2.从中间位置一次向两侧对比
        //从中间向两侧对比,需要将左半部分进行翻转,才能够实现
        while(right!=null&&pre!=null){
    
    
            if(right.val!=pre.val){
    
    
                return false;
            }
            right = right.next;
            pre = pre.next;
        }
        return true;
    }

猜你喜欢

转载自blog.csdn.net/dirksmaller/article/details/106937985