题目
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例
输入:head = [1,2,2,1]
输出:true
输入:head = [1,2]
输出:false
思路
要判断一个单链表是否为回文链表,可以使用以下步骤:
- 找到链表的中间节点:可以使用快慢指针方法,快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针指向的节点即为中间节点。
- 反转后半部分链表:从中间节点开始,将后半部分链表进行反转。
- 比较前半部分链表和反转后的后半部分链表:同时遍历前半部分和后半部分链表,逐个比较节点的值是否相等。如果所有节点的值都相等,则链表为回文链表;否则,不是回文链表。
Code
#include <iostream>
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
bool isPalindrome(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return true;
}
// 找到链表的中间节点
ListNode* slow = head;
ListNode* fast = head;
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
// 反转后半部分链表
ListNode* prev = nullptr;
ListNode* cur = slow->next;
while (cur) {
ListNode* next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
slow->next = nullptr;
// 比较前半部分和后半部分链表
ListNode* p1 = head;
ListNode* p2 = prev;
while (p1 && p2) {
if (p1->val != p2->val) {
return false;
}
p1 = p1->next;
p2 = p2->next;
}
return true;
}
这段代码通过使用快慢指针找到链表的中间节点,然后反转后半部分链表,最后比较前半部分和反转后的后半部分链表的节点值,判断是否为回文链表。