leetcode 234.回文链表(palindrome linked list)C语言
1.description
https://leetcode-cn.com/problems/palindrome-linked-list/description/
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
2.solution
1.利用快慢指针定位中间节点
2.从中间节点对后半部分逆序
3.前后半部分比较,判断是否为回文
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* pre = NULL;
struct ListNode* cur;
struct ListNode* tmp;
cur = head;
while(cur){
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
bool isPalindrome(struct ListNode* head){
if(head == NULL || head->next == NULL) return true;
struct ListNode *slow = head->next;
struct ListNode *fast = head->next->next;
struct ListNode *left = head;
struct ListNode *right = NULL;
// 快慢指针找链表中点
while(fast!=NULL && fast->next!=NULL){
slow = slow->next;
fast = fast->next->next;
}
if(fast==NULL){ // 说明有偶数个node slow为中间偏右节点 例1 2 3 4中的3
right = reverseList(slow);
}else{ // fast->next==NULL 奇数个node slow为中间节点 例1 2 3 4 5中的3
right = reverseList(slow->next);
}
while(right!=NULL){
if(left->val!=right->val){
return false;
}
left = left->next;
right = right->next;
}
return true;
}