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

【C语言】实战-力扣题库:回文链表

题目描述

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

提示:

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

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

问题分析

O(1)的时间复杂度---跟n不产生关系

        因为链表只能比较当前值和next域的值,因此我们把链表中的值导入到数组当中进行比较。

我的解法:

比较前面和后面的值,两个指针同时往中间走进行比较。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool isPalindrome(struct ListNode* head) {
   int arr[100000];
   int index=0;
   struct ListNode* flag=head;
   while(flag!=NULL){
        arr[index]=flag->val;
        index++;
        flag=flag->next;
   }
   
   int i=0;
   int j=index-1;
   for(;i<j;){
        if(arr[i]==arr[j]){
            i++;
            j--;
        }else{
            return false;
        }
        
   }
   return true;
}

另一种解法:

快慢指针能够找到链表中间位置,也能判断链表是否有环。

一个走一步,一个走两步

后面的链表翻转,比较两段链表的值。

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool isPalindrome(struct ListNode* head) {
   if(head==NULL||head->next==NULL){
    return true;
   }
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    //后半段翻转
    struct ListNode* h=NULL;
    struct ListNode* f=slow;
    while(f!=NULL){
        struct ListNode* w=f->next;
        f->next=h;
        h=f;
        f=w;
    }
    //比较两个链表
    while(h!=NULL){
        if(head->val!=h->val){
            return false;
        }
        head=head->next;
        h=h->next;
    }
    return true;


}

 


http://www.kler.cn/a/382625.html

相关文章:

  • 安装和运行开发微信小程序
  • Centos开机自启动脚本示例
  • 开源协议类型及长安链开源协议介绍
  • 基于SpringBoot+Vue实现新零售商城系统
  • SQLAlchemy 介绍与实践
  • 【ChatGPT】让ChatGPT在回答中附带参考文献与来源
  • 【LeetCode】【算法】238. 除自身以外数组的乘积
  • Hadoop集群的高可用(HA)-(2、搭建resourcemanager的高可用)
  • dbt 数据分析工程实战教程(汇总篇)
  • Mill:比Maven快10倍的JVM构建工具
  • 如何理解美国总统Trump这个单词
  • 数据库SQL学习笔记
  • OpenCV C++ 计算两幅图像之间的多尺度结构相似性(MSSIM)
  • 前端八股文(三)JS、ES6 持续更新中。。。
  • pycharm小游戏贪吃蛇及pygame模块学习()
  • ORB-SLAM2源码学习:ORBextractor.cc:ComputePyramid构建图像金字塔①
  • 【C/C++】模拟实现strcat
  • Pr 视频过渡:沉浸式视频 - VR 光线
  • git 提交管理
  • ArcGIS006:ArcMap常用操作151-200例动图演示
  • Go构造函数的实现
  • 如何设置内网IP的端口映射到公网
  • Java+Swing可视化图像处理软件
  • 720VR全景的未来发展趋势与行业前景
  • C++面向对象高级开发B
  • ansible进阶功能