题目
菜鸟解答
O(n)的时间复杂度 这样只能遍历一遍
O(1)的空间复杂度 不能额外新增辅助存储
–> 快慢指针找到中间节点 慢节点遍历的时候改变链表指向方向 这样到中间节点的时候可以与后半段顺序比较 比较的同时在恢复链表指向关系
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head){
bool res = true;
struct ListNode *slow,*quick;
struct ListNode *prev,*next;
struct ListNode *right,*left;
if (NULL == head || NULL == head->next)
return true;
slow = quick = head;
next = head->next;
while (quick != NULL && quick->next != NULL) {
quick = quick->next;
quick = quick->next;
prev = slow;
slow = next;
next = next->next;
slow->next = prev;
}
if (NULL == quick) { /*偶*/
right = slow;
left = prev;
}
else if (NULL == quick->next) {
right = next;
left = prev;
}
slow->next = next; /*恢复*/
head->next = NULL;
prev = slow;
while (left != NULL) {
if (res == true && right->val != left->val)
res = false;
if (right->next != NULL)
right = right->next;
next = left->next;
left->next = prev;
prev = left;
left = next;
}
return res;
}