# 234 回文链表

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/palindrome-linked-list

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

# 一、题目描述

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:

输入:head = [1, 2, 2, 1]

输出:true

示例 2:

输入:head = [1, 2]

输出:false

提示:

  • 链表中节点数目在范围[1, 105] 内
  • 0 <= Node.val <= 9

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

# 二、解法

class Solution {
   public:
    bool isPalindrome(ListNode* head) {
        if (head == NULL || head->next == NULL) {
            return true;
        }
        ListNode* slow = head;
        ListNode* fast = head;
        stack<int> preHalf;
        preHalf.push(head->val);
        while (fast->next != NULL) {
            slow = slow->next;
            if (fast->next != NULL) {
                fast = fast->next;
                if (fast->next != NULL) {
                    fast = fast->next;
                }     
            }
            // 存了前面一半的数据
            preHalf.push(slow->val);
        }

        while (!preHalf.empty()) {
            int temp = preHalf.top();
            if (slow->next != NULL && temp == slow->next->val) {
                preHalf.pop();
                slow = slow->next;
            } else {
                return false;
            }
        }
        return true;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34