欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 数据结构-链表OJ-回文链表,如何将时间复杂度控制为O(N),空间复杂度控制为O(1)?

数据结构-链表OJ-回文链表,如何将时间复杂度控制为O(N),空间复杂度控制为O(1)?

2025/11/4 3:15:51 来源:https://blog.csdn.net/2201_75587951/article/details/148569894  浏览:    关键词:数据结构-链表OJ-回文链表,如何将时间复杂度控制为O(N),空间复杂度控制为O(1)?

链表的回文结构

  • 前言
  • 回文链表


前言

本篇讲解链表的回文结构

回文链表

题目链接:https://leetcode.cn/problems/palindrome-linked-list/description/
在这里插入图片描述
我们仅讲解能够将时间复杂度控制为O(n) 并且将空间复杂度控制为 O(1)的思路

首先,题目要求我们判断是否为回文结构,那么我们可以和之前一样,以中间结点为切入点

我们采用快慢指针法,找到中间结点(当快指针为空或快指针的下一个结点为空时,慢指针刚好走到中间结点,如果有偶数个结点,那么记慢指针走到第三个结点为中间结点),之后对中间结点开始及之后的结点进行逆置,中间结点的前一个结点next置为空,逆置完成后,一个从新的头结点开始,另一个从头结点开始(中间结点之前的原头结点)开始进行比较,直到一方为空

实现代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
bool isPalindrome(struct ListNode* head) {struct ListNode* slow = head;struct ListNode* fast = head;struct ListNode* prev = slow;while(fast && fast->next){prev = slow;slow = slow->next;fast = fast->next->next;}prev->next = NULL;struct ListNode* mid = slow;struct ListNode* prev1 = NULL;struct ListNode* next1 = mid;struct ListNode* cur = NULL;while(next1){if(prev1 == NULL){cur = prev1 = next1;next1 = next1->next;prev1->next = NULL;}else{cur = next1;next1 = next1->next;cur->next = prev1;prev1 = cur;}}struct ListNode* newhead = head;while(newhead){if(newhead->val != cur->val){return false;}newhead = newhead->next;cur = cur->next;}return true;
}

以上为此篇全部内容!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词