很妙的一道题 Leetcode234. 回文链表
分类: 链表;栈
难度: 简单
情况: /*
备注: 反转链表模板;快慢指针
tags:
- leetcode
链接:234. 回文链表
题面
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
代码
解法一:栈
这个解法可以看官方题解里的视频(就是那个类似ppt一样一步一步的图),更直观一些。
很妙!利用系统栈来储存cur
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode *front;bool check(ListNode *cur) {if (cur != nullptr) {if (check(cur->next) == false) {return false;}if (cur->val != front->val) {return false;}front = front->next;}return true;}bool isPalindrome(ListNode* head) {front = head;return check(head);}
};
解法二:快慢指针+反转链表
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:bool isPalindrome(ListNode* head) {ListNode *fast = head, *slow = head;while (fast->next && fast->next->next) {fast = fast->next->next;slow = slow->next;}// if (fast->next) fast = fast->next;// cout << fast->val << " " << slow->val << endl;ListNode* prev = nullptr;ListNode *cur = slow->next; // 下半段链表的开始节点while (cur) {ListNode *temp = cur->next;cur->next = prev;prev = cur;cur = temp;}// cout << prev->val << endl;// while (head != prev) {// prev才是反转后链表的入口while (prev) { // cout << prev->val << " " << head->val << endl;if (head->val != prev->val) return false;head = head->next;prev = prev->next;}return true;}
};
遇到的错误
反转链表模板:
ListNode* prev = nullptr;
ListNode* curr = slow->next; // 反转 slow 之后的部分
while (curr) {ListNode* nextTemp = curr->next;curr->next = prev;prev = curr;curr = nextTemp;
}
prev
就是反转后的链表头。- 反转链表是把后半段断开,变成一个独立的链表
- 循环中prev和curr的赋值顺序不能变
- 我最开始以为反转链表只是改变了指针方向,那
fast
应该还是指向最后一个节点,但是反转完后,fast
仍然指向原链表的尾节点(值为 1),但是它的next
已经被你反转为了nullptr
,fast
不再是反转链表的入口
e.g.
1 → 2 → 3 → 2 → 1
反转后:1 → 2 → 3 1 ← 2↑prev
相关的题
leetcode206. 反转链表