题目
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。
如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
链表中节点数目在范围[1, 10^5] 内
0 <= Node.val <= 9
进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
题中所给
struct ListNode
{
int val;
struct ListNode* next;
};
思路:
参照上一题逆置链表的做法,先将原链表的数据保存在数组中,再用逆置之后的链表与数组元素一一比较
struct ListNode* Reverse(struct ListNode* head)
{
struct ListNode* p=head;
struct ListNode* q=p;
head = head->next;
while (p != NULL)
{
q = q->next;
p->next = head;
head = p;
p = q;
}
return head;
}
bool isPalindrome(struct ListNode* head)
{
int* arr = (int*)malloc(100000 * sizeof(int));
int i = 0;
for (struct ListNode* q = head; q != NULL; q = q->next)
{
arr[i] = q->val;
i++;
}
struct ListNode* p=Reverse(head);
int j=0;
while (j!=i)
{
if (p->val != arr[j])
{
return false;
}
p = p->next;
j++;
}
return true;
}