Leetcode 234. Palindrome Linked List回文链表

来源:互联网 发布:美图秀秀软件怎样赚钱 编辑:程序博客网 时间:2024/06/09 19:51

一、题目描述

判断链表是否是回文链表,要求时间复杂度为O(n),空间复杂度为O(1)

二、解题思路

1、取得链表的长度
2、反转任意一半链表
3、双指针从前往后扫描,判断是否是回文链表

三、代码实现

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    /**    1.获取链表长度    */    public int lengthOfList(ListNode head) {        ListNode p = head;        int n = 0;        while ( p != null) {            n++;            p = p.next;        }        return n;    }    /**    2.反转一半链表    */    public ListNode reverseList(ListNode head) {        ListNode pre = head;        ListNode p = pre.next;        ListNode next;        while (p != null) {            next = p.next;            p.next = pre;            pre = p;            p = next;        }        head.next = null;        return pre;    }    /**    3.判断是否是回文链表    */    public boolean isPalindrome(ListNode head) {        if (head == null || head.next == null)            return true;        int n = lengthOfList(head); //获取链表的长度        int half = n/2;        //1 2 3 4 3 2 1        ListNode leftEnd = head;        for (int i = 0; i < half - 1; i++) {            leftEnd = leftEnd.next;        }        ListNode rightStart = leftEnd.next;        if(n%2 != 0){            rightStart = rightStart.next;        }        rightStart = reverseList(rightStart);        ListNode leftStart = head;        for (int i = 1; i <= half; i++) {            if(leftStart.val != rightStart.val) {                return false;            } else {                leftStart = leftStart.next;                rightStart = rightStart.next;            }        }        return true;    }}
0 0
原创粉丝点击