题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例

输入:head = [1,2,2,1]
输出:true

输入:head = [1,2]
输出:false

思路

要判断一个单链表是否为回文链表,可以使用以下步骤:

  1. 找到链表的中间节点:可以使用快慢指针方法,快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针指向的节点即为中间节点。
  2. 反转后半部分链表:从中间节点开始,将后半部分链表进行反转。
  3. 比较前半部分链表和反转后的后半部分链表:同时遍历前半部分和后半部分链表,逐个比较节点的值是否相等。如果所有节点的值都相等,则链表为回文链表;否则,不是回文链表。

Code

#include 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;}

这段代码通过使用快慢指针找到链表的中间节点,然后反转后半部分链表,最后比较前半部分和反转后的后半部分链表的节点值,判断是否为回文链表