c++代码:请编写算法判断链表是否为回文链表。如果是返回 true ;否则返回 false。要求:空间复杂度为O1并请分析程序的时间性能。
思路:
- 找到链表中点,可以使用快慢指针,当快指针到达链表末尾时,慢指针指向中间节点。
- 反转链表后半部分。
- 将前半部分和后半部分进行比较,判断是否为回文链表。
时间复杂度:O(n),其中n为链表长度。需要遍历链表找到中点,反转链表后半部分,以及比较前半部分和后半部分,都是一次遍历,因此总时间复杂度为O(n)。
空间复杂度:O(1),只需要常数个额外变量。
代码如下:
bool isPalindrome(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return true;
}
// 快慢指针找中点
ListNode* slow = head;
ListNode* fast = head;
while (fast->next != nullptr && fast->next->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
}
// 反转后半部分链表
ListNode* pre = nullptr;
ListNode* cur = slow->next;
while (cur != nullptr) {
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
// 比较前半部分和后半部分链表
while (pre != nullptr) {
if (head->val != pre->val) {
return false;
}
head = head->next;
pre = pre->next;
}
return true;
}
原文地址: https://www.cveoy.top/t/topic/bbLw 著作权归作者所有。请勿转载和采集!