# 234. 回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
# 解题思路
- 遍历获取链表长度,同时计算得到中间节点;
- 然后再次遍历链表,将中间节点之前的节点值存入数组中;
- 对于中间节点之后的节点,判断其值是否与数组中对应项的值相等;
- 需要注意的是,当总数为奇数个节点时,中间节点需要直接跳过。
/**
* 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)
{
int len = 1;
ListNode *cur = head;
while (cur->next)
{
len++;
cur = cur->next;
}
if (len == 1)
{
return true;
}
bool is_ood = false;
if (len % 2 != 0)
{
is_ood = true;
}
ListNode *left = head;
ListNode *right = head;
int total = len;
len = len / 2;
int i = 1;
int nums[len];
while (i <= total)
{
// 奇数个节点时,中间节点需要直接跳过
if (is_ood && i == len + 1)
{
i++;
right = right->next;
continue;
}
if (i <= len)
{
nums[i - 1] = right->val;
}
if ((!is_ood && i > len) || (is_ood && i > len + 1))
{
if (nums[total - i] != right->val)
{
return false;
}
}
i++;
right = right->next;
}
return true;
}
};
# 参考
← 203. 移除链表元素 328. 奇偶链表 →