给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。用C语言实现
时间: 2024-05-06 20:19:43 浏览: 136
```
#include <stdbool.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 反转链表函数
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;
}
bool isPalindrome(ListNode* head) {
if (head == NULL || head->next == NULL) {
return true;
}
// 找到链表中间节点
ListNode *slow = head;
ListNode *fast = head->next;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
// 反转后半部分链表
ListNode *mid = slow->next;
ListNode *newHead = reverseList(mid);
// 比较前半部分和后半部分链表
ListNode *p1 = head;
ListNode *p2 = newHead;
bool isPalin = true;
while (p2 != NULL) {
if (p1->val != p2->val) {
isPalin = false;
break;
}
p1 = p1->next;
p2 = p2->next;
}
// 恢复后半部分链表
mid->next = reverseList(newHead);
return isPalin;
}
```
阅读全文