leetcode题解-234. Palindrome Linked List

Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?

题目是想要判断一个链表的值是否满足回文条件。要求使用O(1)的空间复杂度可能是本题的难点。这就要求我们不能使用别得数据结构对链表的值进行保存在判断。所以我一开始就想能否使用链表翻转来实现,因为感觉这是唯一的突破口==但是如果对原始链表进行翻转,如果in-place则会丢失元链表,否则就会使用额外的存储空间。然后继续分析本题,会发现如果链表是回文,那么前半部分和后半部分一定是一样的。所以我肯可以将后半部分反转,然后再跟前半部分进行比较。这样效果是最好的。代码如下所示:

    public static boolean isPalindrome1(ListNode head) {
        ListNode fast=head, slow=head;

        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        //如果链表长度为奇数
        if(fast != null) slow = slow.next;

        ListNode end=null, tmp;
        while(slow != null){
            tmp = slow.next;
            slow.next = end;
            end = slow;
            slow = tmp;
        }

        while(end != null){
            if(end.val != head.val)
                return false;
            end = end.next;
            head = head.next;
        }

        return true;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值