题目:
Given a singly linked list, determine if it is a palindrome.
本题的难点主要是要求时间复杂度为O(n),空间复杂O(1),我个人的思路就是先统计一下链表长度,然后逆置后半部分的链表,再一一比较。
/**
* 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:
ListNode *reverseList(ListNode* head)
{
ListNode *r = head->next;
head -> next = nullptr;
while(r != nullptr)
{
ListNode *s = new ListNode;
s->val = r ->val;
s->next = head->next;
head->next = s;
r = r->next;
}
return head->next;
}
int getLength(ListNode* head)
{
int count = 0;
while(head != nullptr)
{
count ++;
head = head->next;
}
return count;
}
bool isPalindrome(ListNode* head) {
int length = getLength(head);
if(length <= 1)return true;
ListNode* head1 = head;
int half = length / 2;
if(length % 2 != 0)head1 = head1->next;
while(--half > 0)
head1 = head1->next;
head1 = reverseList(head1);
while(head1 != nullptr)
{
if(head1->val != head->val)return false;
head1 = head1->next;
head = head->next;
}
return true;
}
};