Loading

Leetcode0234. 回文链表

234. 回文链表

方法: 快慢指针

主要思路: 使用快慢指针,从第一个位置开始(不是从dummyHead开始),slow最后指向的是靠后中间位置;(类似于二分)
然后我们可以在慢指针移动过程中,将前面一半的链表反转;slow之前的所有节点都以反转next。
我们获得前后两段连接: l1 = prevl2 = next;
当链表为奇数个结点的时候,l2中节点个数比l1多一个;
后续我们只需要判断一下,当前fast指针是否为null,判断链表节点个数为奇数还是偶数,是奇数则后移一个位置;
在对两个链表是否相等进行进行判断;
时间复杂度:O(n)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null)
            return true;
        // 两个都从第一个开始后移;slow指向靠后位置;
        ListNode slow = head, fast = head;
        ListNode prev = head;
        while(fast != null && fast.next != null) {
            // fast后移;
            fast = fast.next.next;

            ListNode next = slow.next;
            slow.next = prev;
            prev = slow;
            slow = next;
        }

        //slow之前所有的节点都往前指了;
        ListNode l1 = prev;
        ListNode l2 = slow;
        // 如果fast!= null 则是, 奇数个点,slow指向后面;
        // 往后移动一位
        if(fast != null) {
            l2 = l2.next;
        } 
        while(l2 != null) {
            if(l1.val != l2.val)
                return false;
            l2 = l2.next;
            l1 = l1.next;
        }
        return true;
    }
}

posted @ 2020-10-23 15:49  Sidewinder  阅读(61)  评论(0编辑  收藏  举报