1

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(N) 空间 O(1)

思路

两个指针都从头出发,快指针每次两步,慢指针每次一步,这样快指针的下一个或下下个为空时,慢指针就在链表正中间那个节点了(如果链表有偶数个节点则在靠近头那侧的)。然后我们从慢指针的下一个开始,把后面的链表都反转(Reverse Linked List),然后我们再从头和从尾同时向中间前进,就可以判断该链表是不是回文了。

代码

public class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null) return true;
        ListNode fast = head;
        ListNode slow = head;
        // 寻找中点
        while(fast.next != null && fast.next.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        // 记录第二段链表的第一个节点
        ListNode secondHead = slow.next;
        ListNode p1 = secondHead;
        ListNode p2 = p1.next;
        // 将第一段链表的尾巴置空
        slow.next = null;
        while(p1 != null && p2 != null){
            ListNode tmp = p2.next;
            p2.next = p1;
            p1 = p2;
            p2 = tmp;
        }
        // 将第二段链表的尾巴置空
        secondHead.next = null;
        // 依次判断
        while(p1 != null){
            if(head.val != p1.val) return false;
            head = head.next;
            p1 = p1.next;
        }
        return true;
    }
}

ethannnli
858 声望360 粉丝