题目描述: 回文链表
请检查一个链表是否为回文链表。
进阶:
你能在 O(n) 的时间和 O(1) 的额外空间中做到吗?
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int> v;
while(head != NULL) {
v.push_back(head->val);
head = head->next;
}
for(int i = 0 ; i < v.size() ; i ++) {
if(v[i] != v[v.size() - i -1]) return false;
}
return true;
}
};
进阶——看的别人的代码:
先找到链表的中点,然后把后半段翻转,最后比较前半段和后半段是否相同。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* p = head;
ListNode* q = head;
if(head == nullptr)
return true;
while(q->next && q->next->next)
{
p = p->next;
q = q->next->next;
}
p = p->next;
ListNode* re = nullptr;
while(p)
{
ListNode* tmp = p->next;
p->next = re;
re = p;
p = tmp;
}
while(re)
{
if(head->val != re->val)
return false;
head = head->next;
re = re->next;
}
return true;
}
};