ZBLOG

bool isPalindrome(ListNode* head) { vectorans; while(head){ ans.emplace_back(head->val); head=head->next; } int size=ans.size(); int left=0,right=size-1; for(int i=(left+right)/2,j=(le...

在你提供的代码中,isPalindrome 函数是用于判断一个链表是否为回文链表。下面是对代码的一些分析和可能需要修改的地方:

代码分析

  1. 将链表值存入数组:首先,你使用一个 vector<int> ans; 来存储链表节点的值。这段逻辑是正确的,可以遍历整个链表并将每个节点的值添加到数组中。

  2. 检查回文

    • 你使用两个指针 leftright 分别从数组的两端向中间移动来比较元素。
    • 使用循环条件 (i >= 0, j <= size) 是不够准确的,因为这会导致下标越界(因为 j 应该小于 size)。

错误与修正

  1. 循环边界: 在你的循环中,应该有一个适当的条件限制,以确保不会访问超出数组范围的位置。

  2. 索引调整: 对应地,应当这样写:

  1. bool isPalindrome(ListNode* head) {
  2. vector<int> ans;
  3. while (head) {
  4. ans.emplace_back(head->val);
  5. head = head->next;
  6. }
  7. int size = ans.size();
  8. int left = 0, right = size - 1;
  9. while (left < right) { // 注意这里
  10. if (ans[left] != ans[right]) {
  11. return false;
  12. }
  13. left++;
  14. right--;
  15. }
  16. return true;
  17. }

改进点

  • 使用双指针方法而不是使用额外的空间存储所有节点的值。在没有额外空间需求时,可以通过快慢指针找到链表中间节点,然后反转后半部分,再进行比较。

这是改进后的无额外空间解决方案:

  1. bool isPalindrome(ListNode* head) {
  2. if (!head || !head->next) return true;
  3. // 快慢指针找到中间节点
  4. ListNode *slow = head, *fast = head;
  5. while (fast && fast->next) {
  6. slow = slow->next;
  7. fast = fast->next->next;
  8. }
  9. // 反转后半部分
  10. ListNode *prev = nullptr, *curr = slow;
  11. while (curr) {
  12. ListNode *nextTemp = curr->next;
  13. curr->next = prev; // 反转指针
  14. prev = curr; // 移动prev到当前
  15. curr = nextTemp; // 移动curr到下一节点
  16. }
  17. // prev现在指向新头部,开始比较前半部分和后半部分
  18. ListNode *firstHalfHead = head;
  19. ListNode *secondHalfHead = prev;
  20. while (secondHalfHead) {
  21. if (firstHalfHead->val != secondHalfHead->val) {
  22. return false;
  23. }
  24. firstHalfHead = firstHalfHead->next;
  25. secondHalfHead = secondHalfHead->next;
  26. }
  27. return true;
  28. }

这个算法在时间复杂度上仍然是 O(n),但仅需 O(1) 的额外空间。希望这些信息能帮助你更好地理解回文链表问题!如果有其他问题,请随时询问。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=18782

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?