leetcode刷题题解——234. 回文链表

官方解答的三种方法,运行时间都比较长,因此想分享一下自己的方法,运行结果如下。
leetcode刷题题解——234. 回文链表_第1张图片

题目描述

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

解题思路

1.先遍历整个链表,得到链表的长度length。
2.创建一个新的头结点new_head,之后从头开始遍历链表,将链表前1/2的节点利用头插法插入到结点new_head后面(用头插法的目的是将前半段链表翻转,便于之后的比较),这样操作后new_head.next即为前半段最后一个元素。
3.需要考虑链表的长度为奇数还是偶数,若为奇数,则需要跳过最中间的节点(第n/2个节点)。
4.依次比较前半段翻转后的链表与后半段链表每一个节点的值,判断是否相同,如果全部相同,则为回文链表,否则不是回文链表。
代码如下

public static boolean isPalindrome(ListNode head) {
        if (head==null)
            return true;
        ListNode p=head;
        int length=0;
        while (p!=null){
            length++;
            p=p.next;
        }
        ListNode new_head=new ListNode(-1);           //创建的新的头结点
        p=head;
        for (int i=0;i<length/2;i++){                //在前半段遍历的过程中用头插法翻转链表
            ListNode p1=p.next;
            p.next=new_head.next;
            new_head.next=p;
            p=p1;
        }
        if (length%2!=0)                           //如果链表长度为奇数,跳过最中间节点
            p=p.next;
        ListNode q=new_head.next;
        for (int i=0;i<length/2;i++){             //依次比较
            if (p.val!=q.val)
                return false;
            p=p.next;
            q=q.next;
        }
        return true;
    }

如有问题,希望大家指出!!!

你可能感兴趣的:(LeetCode)