c++代码:请编写算法判断链表是否为回文链表。要求:空间复杂度为O1并请分析程序的时间性能。
时间性能分析:
- 遍历一遍链表,判断链表长度,时间复杂度为O(n)
- 将链表后半部分翻转,时间复杂度为O(n/2)
- 依次比较前半部分和后半部分的节点值是否相等,时间复杂度为O(n/2) 总时间复杂度为 O(n)
代码如下:
bool isPalindrome(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return true;
}
// 1. 计算链表长度
int len = 0;
ListNode* p = head;
while (p != nullptr) {
len++;
p = p->next;
}
// 2. 翻转后半部分链表
ListNode* prev = nullptr;
p = head;
for (int i = 0; i < len / 2; i++) {
prev = p;
p = p->next;
}
ListNode* tail = prev;
while (p != nullptr) {
ListNode* next = p->next;
p->next = prev;
prev = p;
p = next;
}
tail->next = nullptr;
// 3. 比较前半部分和后半部分的节点值
ListNode* p1 = head;
ListNode* p2 = prev;
bool result = true;
while (p1 != nullptr && p2 != nullptr) {
if (p1->val != p2->val) {
result = false;
break;
}
p1 = p1->next;
p2 = p2->next;
}
// 4. 恢复后半部分链表
prev = nullptr;
p = tail;
while (p != nullptr) {
ListNode* next = p->next;
p->next = prev;
prev = p;
p = next;
}
tail->next = prev;
return result;
}
原文地址: https://www.cveoy.top/t/topic/bbMK 著作权归作者所有。请勿转载和采集!