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

链表的回文结构OJ

链表的回文结构_牛客题霸_牛客网对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为。题目来自【牛客题霸】icon-default.png?t=N7T8https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking

题目

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

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

测试样例:
1->2->2->1
返回:true

 本题用到了链表的逆转和链表的中间节点的应用

首先说一下链表的中间节点的查找

struct ListNode* midfind(struct ListNode* head)
{
  struct ListNode*fast,*slow=head;
  while(fast&&fast->next)
  {
     fast=fast->next->next;
     slow=slow->next;
  }
  return slow;

  }

 中间结点的查找主要运用到了快慢指针的遍历。快指针比慢指针多走一步,最后快指针走到NULL,或者快指针的next为NULL停止。

再来说一下链表的逆转

struct ListNode* reverselist(struct ListNode*head)
{
    struct ListNode*prve= NULL;
    struct ListNode*cur=head;
    while(cur)
    {
        struct ListNode*next=cur->next;
        cur->next=prve;
        prve=cur;
        cur=next;
    }
    return prve;
}

逆转的本质是要先定义一个空指针,如上代码的*prve,然后下一步就开始保存cur的下一个指针,防止cur被覆盖,导致下一个节点丢失。最后返回prve即可。原因是这是的cur已经指向NULL,所以无意义

最后是实现链表回文(注意:C++兼容C语言)

#include <algorithm>
class PalindromeList {
public:

struct ListNode* midfind(struct ListNode* head)
{
  struct ListNode*fast,*slow=head;
  while(fast&&fast->next)
  {
     fast=fast->next->next;
     slow=slow->next;
  }
  return slow;

  }
struct ListNode* reverselist(struct ListNode*head)
{
    struct ListNode*prve= NULL;
    struct ListNode*cur=head;
    while(cur)
    {
        struct ListNode*next=cur->next;
        cur->next=prve;
        prve=cur;
        cur=next;
    }
    return prve;
}

    bool chkPalindrome(ListNode* A) {
struct ListNode* mid=midfind(A);
struct ListNode* revermid=reverselist(mid);
while(revermid&&A)
{
   if(revermid->val!=A->val)
   {
    return false;
}
revermid=revermid->next;
       A=A->next;
    }
    return true;
}

};

http://www.dtcms.com/a/10701.html

相关文章:

  • CSS实现一个雨滴滑落效果
  • 【第二节】C/C++数据结构之线性表
  • 【linux】自定义快捷命令/脚本
  • 【机器学习】训练GNN图神经网络模型进行节点分类
  • WindowManager相关容器类
  • 【自定义View】Android圆饼进度条
  • 循环嵌套语句的实际应用(2)
  • C#中的实体属性详解与示例
  • 基于Python的北京天气数据可视化分析
  • Kafka之Consumer原理
  • 软光敏的程序实现
  • 顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-同振与顺振的用法
  • [office] 如何才能用EXCEL打开dat文件- #微信#学习方法
  • 植物大战僵尸杂交版2.0.88最新版安装包
  • 【C语言】学生管理系统:完整模拟与实现
  • C++ CMake FetchContent用法介绍
  • BGP基础实验
  • 三维可视化技术在厂区人员、车辆定位中的设计与应用效益
  • 正则表达式三
  • sqlilabs靶场安装
  • python + selenium 实现浏览器的基本操作
  • 上传图片并显示#Vue3#后端接口数据
  • Datetime,一个 Python 的时间掌控者
  • 乙二醇水溶液物性参数
  • 将SU模型导入ARCGIS,并获取高度信息,多面体转SHP文件(ARCMAP)
  • Spring boot 集成mybatis-plus
  • 【MMU】——MMU 相关的 CP15 寄存器
  • uniapp通过Canvas绘制网格(心电图,坐标纸等可用)
  • 联合(union)和枚举(enum)学习(c语言)
  • 常用STL标准模板库