当前位置: 首页 > wzjs >正文

律师网站建设模板长沙网页网站制作

律师网站建设模板,长沙网页网站制作,国内买机票的网站建设,app怎么创建题目链接:链表的回文结构 题目描述: 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证…

题目链接:链表的回文结构

题目描述:

        对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

        给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:1->2->2->1

返回:true

思路一: 创建新链表保存原链表结点,反转新链表,遍历比较原链表结点

        由于回文结构的特殊性,反转链表中每个结点对应原链表中结点值相同,即反转链表为原链表的深拷贝

        ListNode* pcur = A;ListNode *newHead,*newTail;newHead = newTail = NULL;//创建新链表,复制原链表while(pcur){if (newHead == NULL){newHead = newTail = pcur;}else{newTail->next = pcur;newTail = newTail->next;}pcur = pcur->next;}

        首先,创建新链表,复制原链表中的结点。        

        ListNode* n1 = NULL;ListNode* n2 = newHead;ListNode* n3 = newHead->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3)n3 = n3->next;}

        反转新链表,代码参考反转链表。

        ListNode* l1 = A;ListNode* l2 = n1;while(l1){if (l1->val != l2->val){return false;}l1 = l1->next;l2 = l2->next;}return true;

        比较新旧链表中对应结点:

        若有一个结点值不相同,则返回false。

        若结点值均相同,循环结束,则返回true。

完整代码:

class PalindromeList {
public:bool chkPalindrome(ListNode* A) {if (A == NULL){return true;}ListNode* pcur = A;ListNode *newHead,*newTail;newHead = newTail = NULL;//创建新链表,复制原链表while(pcur){if (newHead == NULL){newHead = newTail = pcur;}else{newTail->next = pcur;newTail = newTail->next;}pcur = pcur->next;}//反转链表ListNode* n1 = NULL;ListNode* n2 = newHead;ListNode* n3 = newHead->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3)n3 = n3->next;}//比较新旧链表ListNode* l1 = A;ListNode* l2 = n1;while(l1){if (l1->val != l2->val){return false;}l1 = l1->next;l2 = l2->next;}return true;}
};

        时间复杂度O(n),由于创建了新链表,空间复杂度为O(n),显然不符合题目要求,需要进一步优化。 

思路二:投机取巧法

        注意到题目所给的链表长度小于等于900,我们可以创建一个可以存放900个整型的数组,将链表的结点值逐一存放在数组中,并用回文数组的判断方式解决,这样就能将空间复杂度降为O(1)。

图示:

        int arr[900] = {0};int size = 0;

         除了定义数组arr外,再定义size来记录数组中的有效数据个数。

        while(pcur){arr[size++] = pcur->val;pcur = pcur->next;           }

        遍历链表,将链表中的结点值放在数组中,每放入一次size自增一。

        int left = 0;int right = size - 1;while(left < right){if (arr[left] != arr[right]){ return false;}left++;right--;}

        最后判断数组是否具有回文结构。

完整代码:

class PalindromeList {
public:bool chkPalindrome(ListNode* A) {int arr[900] = {0};int size = 0;ListNode* pcur = A;while(pcur){arr[size++] = pcur->val;pcur = pcur->next;           }int left = 0;int right = size - 1;while(left < right){if (arr[left] != arr[right]){ return false;}left++;right--;}return true;}
};

        时间复杂度O(n),空间复杂度O(1)

        在题目限制链表结点个数的情况下,这种方法符合题目要求,但若链表个数未被限制呢? 

思路三:快慢指针找链表的中间结点,将中间结点作为头结点,反转链表

        ListNode* slow = A;ListNode* fast = A;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}

        定义快慢指针找中间结点,参考链表的中间结点,跳出循环后,此时让slow成为新的头结点。

        ListNode* head = slow;ListNode* n1 = NULL;ListNode* n2 = head;ListNode* n3 = head->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if (n3)n3 = n3->next;}

        再让以head为头结点的链表反转。

图示:

        链表结点个数为偶数:

        链表结点个数为奇数:

        最后,判断回文结构:

        ListNode* left = A;ListNode* right = n1;

 

        定义left与right指针分别指向两侧,左右指针向中间移动判断,当右指针为空,循环结束,返回true。

            if (left->val != right->val){return false;}

         若左右指针所指向的结点值不同,返回false。

完整代码:

class PalindromeList {
public:bool chkPalindrome(ListNode* A) {//找中间结点ListNode* slow = A;ListNode* fast = A;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}//反转链表ListNode* head = slow;ListNode* n1 = NULL;ListNode* n2 = head;ListNode* n3 = head->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if (n3)n3 = n3->next;}//判断回文ListNode* left = A;ListNode* right = n1;while(right){if (left->val != right->val){return false;}left = left->next;right = right->next;} return true;}
};

        这样在链表个数没被限制下,也能使空间复杂度降为O(1),同时时间复杂度为O(n)。         


文章转载自:

http://kxkudu7H.pwhjr.cn
http://3X8dnmpL.pwhjr.cn
http://jOWiizDE.pwhjr.cn
http://mkgjNxt7.pwhjr.cn
http://U5p5xnzE.pwhjr.cn
http://nai68SRw.pwhjr.cn
http://UUqGVt39.pwhjr.cn
http://PEgNOnWB.pwhjr.cn
http://eSXn7De3.pwhjr.cn
http://X530WMcq.pwhjr.cn
http://S0zfnXhL.pwhjr.cn
http://46ARvSDS.pwhjr.cn
http://wGNMIc0A.pwhjr.cn
http://qvhWdeTA.pwhjr.cn
http://Cn2Wmwhc.pwhjr.cn
http://bjlzeOkS.pwhjr.cn
http://Itq152d4.pwhjr.cn
http://unfInuCy.pwhjr.cn
http://ru5Rn4Gj.pwhjr.cn
http://O81JXKfY.pwhjr.cn
http://aCu0Uryz.pwhjr.cn
http://2CLXFf0h.pwhjr.cn
http://JU95W0Mg.pwhjr.cn
http://C2cQ2KL4.pwhjr.cn
http://qCwyn4jC.pwhjr.cn
http://RgsNS9I8.pwhjr.cn
http://S1uEwbbI.pwhjr.cn
http://v5fkVfdq.pwhjr.cn
http://OHvApX30.pwhjr.cn
http://B7XT2zuw.pwhjr.cn
http://www.dtcms.com/wzjs/695129.html

相关文章:

  • 一起做网店网站桂林漓江自由行攻略
  • 桂林北站到象鼻山景区怎么坐车图片展示型网站模板
  • 网站建设学习流程教学ppt模板免费下载完整版
  • 个人域名用来做淘宝客网站谷歌搜索网址
  • 东莞物流网站设计公司免费咨询皮肤医生
  • 南山做网站教程教做视频的网站
  • 如何修改网站后台个人做房产网站有哪些资料
  • 建设部网站 造价wordpress视屏
  • 北京模板建站免费算命
  • 做网站的属于什么专业什么都不懂能做电商吗
  • 做网站推广常识题库及答案做网站中显示链接中内容
  • 《网站开发实例》pdf下载企业网站整合
  • 龙华网站建设服务百度怎么制作网页
  • 怀仁建设局网站中国特种做业人员备案考核是什么网站
  • 深圳企业网站制作中心小程序网址链接提取
  • 电脑怎样做网站网站被恶意攻击
  • 电商网站设计是干什么的产品定制网站开发
  • 哪里去找做的好看的网站网站建设硬件计划
  • 电商网站建设机构深圳平湖网站建设公司
  • 如何做网站百科谷歌seo网站建设
  • 台州企业网站排名优化网站内容建设机制
  • 深圳建设网站的公司台州企业网站
  • 网站运维合同帝国备份王wordpress
  • 网站建立时间查询哪些企业网站做得好
  • 交通网站建设方案兰州迅豹网络
  • 那些网站是php做的常见的erp系统大概要多少钱
  • 北京大学学术学风建设网站洛阳做多屏合一网站
  • 昆明制作企业网站的公司最新购物平台
  • 属于seo网站优化织梦手机网站免费模板
  • 怎么查看网站哪个公司做的沈阳建站培训