Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *reverseList(struct ListNode *head);
bool isPalindrome(struct ListNode* head) {
if (head == NULL || head->next == NULL) //如果只有一个节点,则是回文串
return true;
struct ListNode *slow = head;
struct ListNode *fast = head;
while (fast->next != NULL && fast->next->next != NULL) //fast既不是尾节点也不是倒数第二个节点
{
slow = slow->next; //慢指针走一步
fast = fast->next->next; //快指针走两步
}
slow = slow->next;
struct ListNode *head2 = reverseList(slow);
struct ListNode *head1 = head;
while (head2 != NULL) {
if (head2->val != head1->val)
return false;
head1 = head1->next;
head2 = head2->next;
}
return true;
}
struct ListNode *reverseList(struct ListNode *head) {
struct ListNode *pre = NULL;
struct ListNode *next = NULL;
while (head != NULL) {
next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
原题地址:
https://leetcode.com/problems/palindrome-linked-list/