编写一个函数,检查输入的链表是否是回文的。
示例 1:
输入: 1->2 输出: false
示例 2:
输入: 1->2->2->1 输出: true
进阶:
你能否用 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) {
if(head == NULL)
return true;
ListNode* p = head;
ListNode* q = head;
while(q->next != NULL && q->next->next != NULL)
{
p = p->next;
q = q->next;
q = q->next;
}
ListNode* temp = reverseList(p->next);
while(temp != NULL)
{
if(temp->val != head->val)
return false;
temp = temp->next;
head = head->next;
}
return true;
}
ListNode* reverseList(ListNode* head) {
if(head == NULL)
return head;
ListNode* p = head->next;
ListNode* q = new ListNode(0);
head->next = NULL;
while(p != NULL)
{
q = p->next;
p->next = head;
head = p;
p = q;
}
return head;
}
};