题目描述:给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
知识点:快慢指针+翻转
思路:先找到链表的中间结点,找到中间结点之后,对中间结点到末端这一段链表进行翻转,翻转完后,即可进行一一对比,判断是否为回文链表。
附leetcode链接:234. 回文链表 - 力扣(LeetCode) (leetcode-cn.com)
附代码:
class Solution {
public:
bool isPalindrome(ListNode* head) {
//先用快慢指针找到中间结点
ListNode* fast=head;
ListNode* slow=head;
while(fast!=nullptr&&fast->next!=nullptr)
{
fast=fast->next->next;
slow=slow->next;
}
//此时的slow即为中间结点,对链表后半段进行翻转
ListNode* pre=nullptr;
ListNode* cur=slow;
while(cur!=nullptr)
{
ListNode* next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
//开始进行回文判断
while(pre!=nullptr)
{
if(pre->val!=head->val)
return false;
pre=pre->next;
head=head->next;
}
return true;
}
};