c++代码:请编写算法判断链表是否为回文链表。如果是返回 true ;否则返回 false。
思路:
-
定义两个指针,一个快指针 fast 和一个慢指针 slow,用来找到链表的中间节点。
-
从中间节点开始,将后面的链表反转。
-
然后再将前半部分和后半部分的链表逐一比较,判断是否为回文链表。
-
最后将后半部分的链表再次反转,恢复原来的链表。
代码实现:
bool isPalindrome(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return true;
}
ListNode* fast = head;
ListNode* slow = head;
// 找到链表的中间节点
while (fast->next != nullptr && fast->next->next != nullptr) {
fast = fast->next->next;
slow = slow->next;
}
// 反转后半部分的链表
ListNode* pre = nullptr;
ListNode* cur = slow->next;
while (cur != nullptr) {
ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
// 逐一比较前半部分和后半部分的链表
ListNode* p1 = head;
ListNode* p2 = pre;
bool res = true;
while (res && p2 != nullptr) {
if (p1->val != p2->val) {
res = false;
}
p1 = p1->next;
p2 = p2->next;
}
// 恢复后半部分的链表
cur = pre;
pre = nullptr;
while (cur != nullptr) {
ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
slow->next = pre;
return res;
}
原文地址: https://www.cveoy.top/t/topic/bbMS 著作权归作者所有。请勿转载和采集!