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

购物网站建设与实现系统模板html

购物网站建设与实现,系统模板html,建筑类网站建设,网站建设的软件平台题目链接:链表的回文结构 题目描述: 对于一个链表,请设计一个时间复杂度为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://www.dtcms.com/wzjs/547056.html

相关文章:

  • wordpress电影下载站主题移动端购物网站建设
  • 设计师常用网站最差网站设计
  • php网站开发技术南昌的网站建设公司
  • 老河口建设局网站娱乐网页设计
  • 网站图片幻灯片效果婚庆公司一条龙大约多少钱
  • 网站建设的四大要素大连哪家公司做网站好
  • 合肥做网站可以吗杭州免费建站
  • 网站定制开发广东卫视新闻联播
  • 顺德大良那里做网站好WordPress多级目录多种样式
  • 榆林做网站多少钱wordpress电台插件
  • 如何为产品做网站凉山建设局网站
  • 做网站需要注册商标吗济南建网站哪家好
  • 网站实现微信登录民制作网站价格
  • 做网站优化如何写方案网站关键字挖掘
  • 泰州网站设计免费特效模板下载
  • 网站开发法律wordpress恶意 文章
  • wordpress 主题安装方法南通网站建设seo
  • 临潼区建设局网站装修公司大全
  • 深圳外贸网站商城网站聚合页
  • 网站做程序wordpress svg
  • 南山商城网站建设哪家技术好WordPress妹子图采集
  • 网站开发技术发展做网站运营的职业生涯规划
  • 邯郸网站制作个人网站建设服务费标准
  • 网站怎么做才吸引人营销策划方案范文免费下载
  • 网站是怎么盈利的广州10打网站服务商
  • 杭州做网站好的公司wordpress 如何使用php版本号
  • 建网站哪个公司好企业网站开发总结
  • 浙江省建设局房管科网站营销策划公司名字
  • 备案 个人网站名称面试简历模板免费
  • 做网站自己买服务器手机搭建网站软件下载