⭐️ 往期相关文章
💫链接1:链表分割
💫链接2:链表中倒数第k个结点(快慢指针问题)
💫链接3:leetcode 876.链表的中间结点(快慢指针问题)
💫链接4:leetcode 206.反转链表
💫链接5:leetcode 203.移除链表元素
💫链接6:合并两个有序链表
⭐️ 题目描述
🌟 牛客链接:链表的回文结构
1️⃣ c代码:
思路:一个指针从开头走 一个指针从中间走 逆置中间结点到尾结点 互相比较当前结点的元素,若
不相等则不是回文。否则是回文结构。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
/*
思路:一个指针从开头走 一个指针从中间走 逆置中间结点到尾结点 互相比较当前结点的元素,若
不相等则不是回文。
1 -> 2 -> 2 -> 1
head mid
逆置中间结点到尾结点所有元素
1 -> 2 -> 1 -> 2
head mid
同时比较
1 -> 2 -> 1 -> 2
head mid
1 -> 2 -> 1 -> 2 NULL
head mid
true
*/
bool chkPalindrome(ListNode* head) {
// 第一步快慢指针找中间结点
struct ListNode* slow = head;
struct ListNode* fast = head;
// 不确定是奇数个还是偶数个 当 fast 和 fast->next 为空结束
while (fast && fast->next) {
slow = slow->next;
fast = fast->next;
}
// 中间结点的指针
// struct ListNode* middle = slow;
// 逆置中间结点后边的结点
struct ListNode* middle = NULL;
struct ListNode* cur = slow;
while (cur != NULL) {
struct ListNode* next = cur->next;
cur->next = middle;
middle = cur;
cur = next;
}
// 依次相比较元素
while (middle != NULL) {
if (head->val != middle->val) {
return false;
}
// 迭代
middle = middle->next;
head = head->next;
}
return true;
}
};