# 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
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