回文链表
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例 2:
输入: 1->2->2->1 输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
栈:
开销较大
(1)遍历链表,记录链表长度
(2)将链表前1/2长度的元素入栈
(3)将链表后1/2的元素按顺序与堆栈作比较,相同则弹出栈顶元素
(4)如果堆栈为空或者到达链表尾处未出现不同的元素,则证明该链表是回文链表
偶数长度和奇数长度的链表应做不同处理
代码:
class Solution {
public:
bool isPalindrome(ListNode* head) {//自写
if (head == nullptr) return true;
if (head->next == nullptr) return true;
int i = 0;
ListNode* p = head;
ListNode* p2 = head;
while (p) {
i++;
p = p->next;
}
stack<int> stk_val;
for (int n = 0; n < i / 2; n++) {
stk_val.push(p2->val);
p2 = p2->next;
}
if (i % 2 == 0) {//偶数长度
while(p2){
if (p2->val != stk_val.top()) return false;
else {
p2 = p2->next;
stk_val.pop();
}
}
}
else {//奇数长度
p2 = p2->next;
while (p2) {
if (p2->val != stk_val.top()) return false;
else {
p2 = p2->next;
stk_val.pop();
}
}
}
return true;
}
};
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)