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

C++速通LeetCode第5题-回文链表

 

 解法1,堆栈O(n)简单法:

/**
 * 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) {
        stack<int> s;
        ListNode* cp = head;
        bool flag = true;
        while(cp!=nullptr)
        {
            s.push(cp->val);
            cp = cp->next;
        }
        while(head!=nullptr)
        {
            if(s.top()!=head->val)
            {
                return false;
            }
            else
            {
                s.pop();
                head = head->next;
            }
        }
        return true;
    }
};

解法2, 快慢指针确定中间节点并向后逆序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:
    //找到开始逆序的中间节点slow
    ListNode* MiddleNode(ListNode* ori)
    {
        ListNode* countTest = ori;
        ListNode* middleStart = nullptr;
        while(countTest!=nullptr)
        {
            countTest = countTest->next;
        }
        ListNode* fast = ori;
        ListNode* slow = ori;
        
        //奇数偶数一样
        while(fast != nullptr && fast->next!= nullptr)
        {
            fast = fast->next->next;
            slow = slow->next;
        }
        middleStart = slow;
        return middleStart;
    }

    //从slow的中间节点开始逆序,返回逆序后半序列的头节点
    ListNode* ReverseNode(ListNode* start)
    {
        ListNode* pre = nullptr;
        ListNode* cur = start;

        while(cur != nullptr)
        {
            ListNode* temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }

    bool isPalindrome(ListNode* head) {
        ListNode* rev = ReverseNode(MiddleNode(head));
        while(rev!=nullptr)
        {
            if(rev->val!=head->val)
            {
                return false;
            }
            else
            {
            head = head->next;
            rev = rev->next;
            }
        }
        return true;
    }
};


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

相关文章:

  • 2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享
  • 【C++】string类(附题)
  • 【JavaScript】为 setInterval()定义变量,存储ID
  • 利用编程语言和脚本编写技术,实现自动化渗透测试和安全工具的开发
  • 传奇996_19——常用函数
  • 【CVPR2024】2024年CVPR的3D 目标检测的综述(还在补充中)
  • 防止文件外发泄密有什么方法?这7防外发方式可以看下!
  • 数字化转型背景下低代码开发模式变革的研究
  • Excel图表生成:自动化创建与修改Excel图表的技术指南
  • 基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)
  • pytorch torch.triu函数介绍
  • python实现进化算法
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.4】RK3588网络摄像头推理后推流到RTSP更多内容见视频
  • 海思SD3403(21AP10, 108DC2910 )4K60 的 ISP 图像处理能力,4Tops INT8算力
  • 数据结构2 :双向链表和内核链表
  • mysql可重复读不能解决幻读吗?
  • linux————根据端口查找运行目录的三种方法
  • STM32内部闪存FLASH(内部ROM)、IAP
  • 信息安全工程师题
  • ASR(自动语音识别)识别文本效果的打分总结
  • 用Cri-O,Sealos CLI,Kubeadm方式部署K8s高可用集群
  • 【docker】了解什么是Docker
  • 欧洲麻花钻市场主要企业市场占有率及排名
  • Framework | 在Android中运行时获取顶层Activity并处理业务逻辑
  • 【测试】——自动化测试入门(Selenium环境搭建)
  • Golang | Leetcode Golang题解之第395题至少有K个重复字符的最长子串