面试题 02.06. 回文链表

编写一个函数,检查输入的链表是否是回文的。

示例 1:

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

输入: 1->2->2->1
输出: true

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路: 快慢指针找到一半的点;反转后半部分点,对比是否相同;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null&&fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        // 现在slow是一半了;
        ListNode pre = null;
        ListNode temp = slow;
        ListNode tempN = slow;
        while(temp!=null){
            tempN = temp.next;
            temp.next = pre;
            pre = temp;
            temp = tempN;
        }
        ListNode f = head;
        ListNode s = pre;
        while(s!=null){
            if(f.val!=s.val){
                return false;
            }
            f = f.next;
            s = s.next;
        }
        return true;
    }
}

你可能感兴趣的:(面试题 02.06. 回文链表)