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

健康武汉app官网网络优化工程师骗局

健康武汉app官网,网络优化工程师骗局,网站开发设计前景,网上申报流程前言 简单 √ 是反转链表的衍生题,很快写完了。不过没考虑到恢复链表结构的问题。 题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输…

前言

简单 √ 是反转链表的衍生题,很快写完了。不过没考虑到恢复链表结构的问题。

题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:

输入:head = [1,2,2,1]
输出:true

示例 2:

输入:head = [1,2]
输出:false

提示:

  • 链表中节点数目在范围[1, 105] 内
  • 0 <= Node.val <= 9

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路

一开始想着把链表直接反转存储,然后同时遍历。但是考虑到题目要求的O(1)空间复杂度,想到可以只把前半部分,从中间开始向两边遍历。如果链表长度为奇数,跳过最中间的那个数。

我的题解

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:bool isPalindrome(ListNode* head) {if (!head || !head->next){return true;}//链表长度ListNode* node = head;int count = 1;while (node->next){node = node->next;count++;}//反转一半的链表,分奇偶两种情况int len = count / 2;ListNode* pre = nullptr;ListNode* cur = head;while (len--){ListNode* nextnode = cur->next;cur->next = pre;pre = cur;cur = nextnode;}ListNode* left = pre;ListNode* right = cur;if (count % 2 != 0){right = right->next;}//左右同时开始遍历while (left && right){if (left->val != right->val){return false;}left = left->next;right = right->next;}return true;}
};

官方题解

将值复制到数组中后用双指针法

  1. 复制链表值到数组列表中。
  2. 使用双指针法判断是否为回文。
class Solution {
public:bool isPalindrome(ListNode* head) {vector<int> vals;while (head != nullptr) {vals.emplace_back(head->val);head = head->next;}for (int i = 0, j = (int)vals.size() - 1; i < j; ++i, --j) {if (vals[i] != vals[j]) {return false;}}return true;}
};

快慢指针

  1. 找到前半部分链表的尾节点。
  2. 反转后半部分链表。
  3. 判断是否回文。
  4. 恢复链表。
  5. 返回结果。

跟笔者思路差不多,不过多了还原链表结构的步骤

class Solution {
public:bool isPalindrome(ListNode* head) {if (head == nullptr) {return true;}// 找到前半部分链表的尾节点并反转后半部分链表ListNode* firstHalfEnd = endOfFirstHalf(head);ListNode* secondHalfStart = reverseList(firstHalfEnd->next);// 判断是否回文ListNode* p1 = head;ListNode* p2 = secondHalfStart;bool result = true;while (result && p2 != nullptr) {if (p1->val != p2->val) {result = false;}p1 = p1->next;p2 = p2->next;}        // 还原链表并返回结果firstHalfEnd->next = reverseList(secondHalfStart);return result;}ListNode* reverseList(ListNode* head) {ListNode* prev = nullptr;ListNode* curr = head;while (curr != nullptr) {ListNode* nextTemp = curr->next;curr->next = prev;prev = curr;curr = nextTemp;}return prev;}ListNode* endOfFirstHalf(ListNode* head) {ListNode* fast = head;ListNode* slow = head;while (fast->next != nullptr && fast->next->next != nullptr) {fast = fast->next->next;slow = slow->next;}return slow;}
};

心得

有了反转链表的基础,思路就很快想到了。一半反转,同时遍历即可。但是笔者没考虑到还原链表结构,这里暴露出笔者缺乏全局思考,代码拓展性的问题,纯粹是为了做题而做题,有点丢了本心,警醒!另外,反转链表还有个缺点就是需要锁定整个链表来解答,对于系统也不友好。最后,这里再加一个用栈的做法,比数组的做法更好,不过不是O(1)空间复杂度。

http://www.dtcms.com/wzjs/472291.html

相关文章:

  • 网站建设费用计入管理费用windows优化大师是系统软件吗
  • matlab代做网站北京seo公司助力网络营销
  • 奉化区建设局网站产品推广方案怎么写
  • 网站云主机超级优化空间
  • 做网站必备软件网站权重排名
  • qt做网站服务器公司域名注册查询
  • 天津企业模板建站百度app下载安装
  • 网站建设需要哪些优化关键词排名软件
  • 网站备案审核制度5g站长工具查询
  • 网上学做网站如何快速网络推广
  • 中欣卡网上购物商城seo外链工具源码
  • 在手机上编写安卓app网络seo培训
  • 安徽省建设造价网站河北seo网络优化师
  • 惠安通网站建设掌门一对一辅导官网
  • 淮南模板网站建设怎么样优化教程网站推广排名
  • 荆州网站建设价格seo优化系统
  • 房屋设计手机绘图软件seo优化培训多少钱
  • 为什么网站要改版网站运营主要做什么工作
  • 商务网站建设与维护(专21春)最近的电脑培训学校
  • 哪些做展架图的网站好温州seo
  • 个人网站域名起名微信小程序怎么做
  • 个人网站做捐赠发布违法吗企业品牌推广
  • 广告设计专业课程百度seo快速提升排名
  • 室内装饰装修资质证书seo免费视频教程
  • 招远建网站首选公司网站排名查询alexa
  • java项目网站开发网络营销是网上销售吗
  • 住房和城乡建设部干部学院网站营销软件站
  • 山西运城给网站做系统的公司seo服务如何收费
  • 网站管理员登陆后缀日本粉色iphone
  • 新疆教育平台网站建设2023新闻热点事件