问题描述:
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* reverseEnd(struct ListNode* head, int num)
{
int i;
struct ListNode *node, *node_next, *end;
for (i = 0; i < num/2; i++) {
head = head->next;
}
if (num % 2 != 0)
head = head->next;
if (num <= 3)
return head;
node = head;
node_next = node->next;
end = node_next->next;
node->next = NULL;
while (end != NULL) {
node_next->next = node;
node = node_next;
node_next = end;
end = end->next;
}
node_next->next = node;
return node_next;
}
bool isPalindrome(struct ListNode* head) {
if (head == NULL)
return true;
int i, num = 0;
struct ListNode *end = head;
while(end != NULL) {
end = end->next;
num++;
}
if (num == 1)
return true;
end = reverseEnd(head, num);
for (i = 0; i < num/2; i++) {
if (head->val != end->val)
return false;
head = head->next;
end = end->next;
}
return true;
}
总结:一开始想的是遍历链表中的值到数组中,然后判断数组,但这样就无法满足空间复杂度O(1)的要求,想了半天没想出来,上网参考别人的思路,可以将链表的后半段反转,这样就满足了空间复杂度的要求,由于C语言中没有链表反转函数,所以通过reverseEnd函数实现。
第一次提交时在输入样例为[1, 2, 2, 1]时出现Time Limit Exceeded的错误,但检查了老长时间也没出现错误,试着添加第23行代码后提交通过。