给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
时间: 2024-04-30 20:23:15 浏览: 47
思路:
1.使用快慢指针找到链表的中点。
2.将链表的后半部分翻转。
3.比较前半部分和后半部分是否相同。
4.恢复链表并返回结果。
代码如下:
```
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (head == NULL || head->next == NULL) {
return true;
}
ListNode* slow = head;
ListNode* fast = head;
while (fast->next != NULL && fast->next->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
ListNode* secondHalf = reverseList(slow->next);
ListNode* p1 = head;
ListNode* p2 = secondHalf;
bool result = true;
while (p2 != NULL) {
if (p1->val != p2->val) {
result = false;
break;
}
p1 = p1->next;
p2 = p2->next;
}
slow->next = reverseList(secondHalf);
return result;
}
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL;
ListNode* curr = head;
while (curr != NULL) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
};
```
阅读全文