首页 > 其他分享 >【C语言】实战-力扣题库:回文链表

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

时间:2024-11-07 09:15:55浏览次数:3  
标签:力扣 head NULL ListNode struct next 链表 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;


}

 

标签:力扣,head,NULL,ListNode,struct,next,链表,C语言
From: https://blog.csdn.net/m0_75163045/article/details/143557481

相关文章

  • 【C语言】分支和循环详解(下)猜数字游戏
    与诸君共进步!!!!!文章目录1.随机数的生成2.猜数字小游戏的实现1.随机数的生成掌握了前⾯学习的这些知识,我们就可以写⼀些稍微有趣的代码了,⽐如:写⼀个猜数字游戏游戏要求:电脑⾃动⽣成1~100的随机数玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的......
  • 【力扣打卡系列】单调栈
    坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day20单调栈题目描述解题思路单调栈后进先出记录的数据加在最上面丢掉数据也先从最上面开始单调性记录t[i]之前会先把所有小于等于t[i]的数据丢掉,不可能出现上面大下面小的情况倒着遍历,while遍历,......
  • lanqiaoOJ 1110:小王子单链表 ← 数组模拟实现
     【题目来源】https://www.lanqiao.cn/problems/1110/learning/【题目描述】小王子有一天迷上了排队的游戏,桌子上有标号为1-10的10个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把哪个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排......
  • 【leetcode】40-best-time-to-buy-and-sell-stock 力扣 121. 买卖股票的最佳时机
    买卖股票系列【leetcode】40-best-time-to-buy-and-sell-stock力扣121.买卖股票的最佳时机【leetcode】41-best-time-to-buy-and-sell-stock-ii力扣122.买卖股票的最佳时机II【leetcode】42-best-time-to-buy-and-sell-stock-iii力扣123.买卖股票的最佳时机III【le......
  • C语言---文件操作万字详细分析(6)
    文件操作到这里,C语言所有知识点,就告已段落了,虽然知识点到这里结束了,但我想,我们的编程之路也可能刚刚开始,这些知识,是我们在创造伟大事物时,必不可少的基础,是我们未来财富自由之路,必不可少的垫脚之石。相信大家会变得越来越牛逼!不废话了,Let’sstart!一、文件指......
  • C语言数据结构--详细讲解算法复杂度
    C语言数据结构-算法复杂度前言一、时间复杂度1.大O渐进表示法2时间复杂度的计算二、空间复杂度1.什么是空间复杂度2时间复杂度的计算总结前言我们都清楚计算机存储和组织数据是通过数据结构来实现的。当计算机对这些数据结构中的数据进行遍历等操作时,这个过程就......
  • 2个月搞定计算机二级C语言——真题(9)解析
    1.前言本篇我们讲解2个月搞定计算机二级C语言——真题92.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>doublef1(doublex){returnx*x;}doublef2(doublex,doubley){returnx*y;}/**********found**********/__1__fun(int......
  • Python——数据结构与算法-时间复杂度&空间复杂度-链表&树状结构
    1.数据结构和算法简介程序可以理解为:程序=数据结构+算法概述/目的:都可以提高程序的效率(性能)数据结构指的是存储,组织数据的方式.算法指的是为了解决实际业务问题而思考思路和方法,就叫:算法.2.算法的5大特性介绍概述:为了解决实际业务问题,......
  • 重温c语言之,7天开整,就是随便的写写,第七天
    一:素数又见素数但这次不一样,这次需要用到函数,利用函数来将素数区分出来,直接上代码1#include<stdio.h>2#include<math.h>3intprime_num(intnum)4{5for(inti=2;i<sqrt(num);i++)6{7if(num%i==0)8{9......
  • c语言中多个变量连续赋值
     001、[root@PC1test]#lstest.c[root@PC1test]#cattest.c##测试c程序#include<stdio.h>intmain(void){inti,j;i=j=5;//连续赋值printf("i=%d\n",i);printf("j=%......