带你粗略了解C++回文链表

 更新时间:2021年08月18日 17:29:38   作者:久病成良医  
这篇文章主要介绍了Python实现的判断回文链表算法,结合实例形式分析了Python针对链表是否为回文链表进行判断的相关算法实现技巧,需要的朋友可以参考下

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2

输出: false

示例 2:

输入: 1->2->2->1

输出: true

思路

1.用快慢指针,快指针有两步,慢指针走一步,快指针遇到终止位置时,慢指针就在链表中间位置

2.同时用pre记录慢指针指向节点的前一个节点,用来分割链表

3.将链表分为前后均等两部分,如果链表长度是奇数,那么后半部分多一个节点

4.将后半部分反转 ,得cur2,前半部分为cur1

5.按照cur1的长度,一次比较cur1和cur2的节点数值

在这里插入图片描述

/**
 * 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==nullptr||head->next==nullptr)
            return true;
        ListNode* fast=head; //快指针
        ListNode* slow=head; //慢指针,找到链表的中间位置
        ListNode* pre=head;  //慢指针的前一个指针,用来分割链表
        while(fast&&fast->next){  //循环条件是fast和fast的下一个节点是否都存在,不用写fast!=nullptr&&fast->next!=nullptr,直接fast&&fast->next
            pre=slow;
            fast=fast->next->next;
            slow=slow->next;
            //per=slow; //这句不能放在这,这里的slow是slow->next。只能放在slow=slow->next的前面。  
        }
        pre->next=nullptr;  //分割链表。per是前半部分链表的最后一个节点,所以是per的下一个结点为空,不是per==nullptr
        ListNode* cur1=head; //前半部分的链表
        ListNode* cur2=reverse(slow);  //对后半部分的链表进行反转,reverse(ListNode* slow)错误,调用不用写类型ListNode*

        while(cur1){ //循环条件是cur是否为空
            if(cur1->val!=cur2->val)  // 若有一个不相等则返回false
                return false;
            cur1=cur1->next;   //  判断下一个节点
            cur2=cur2->next;   //
        }
        return true;  //都等于则true
    }
        //反转链表
        ListNode* reverse(ListNode* head){
            ListNode* temp; //保存cur的下一个节点,下一次要操作cur->next的节点
            ListNode* cur=head;
            ListNode* pre=nullptr;
            while(cur){
                temp=cur->next;
                cur->next=pre;
                pre=cur;
                cur=temp;
            }
            return pre;
        }
};

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++实现哈希散列表的示例

    C++实现哈希散列表的示例

    本文主要介绍了C++实现哈希散列表的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C++实现字符串类型相互转换的代码示例

    C++实现字符串类型相互转换的代码示例

    在C/C++编程中,字符串是非常基础且常用的数据类型,但是由于不同的编程语言或标准库可能采用不同的字符串类型,因此在不同的应用场景下可能需要进行字符串类型的相互转换,本文将介绍如何在C/C++中将char*,std::string,QString,CString/MFC String相互转换
    2023-06-06
  • 关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++设置系统时间及系统时间网络更新的方法

    C++设置系统时间及系统时间网络更新的方法

    这篇文章主要介绍了C++设置系统时间及系统时间网络更新的方法,涉及网络程序设计与系统函数的使用,需要的朋友可以参考下
    2014-10-10
  • 如何用矩形法(梯形法)求定积分

    如何用矩形法(梯形法)求定积分

    思路就是将积分区间划分成n等份,然后将这n等份近似看成矩形(或梯形),然后对所有的矩形(或梯形)的面积进行求和
    2013-09-09
  • C语言详解判断相同树案例分析

    C语言详解判断相同树案例分析

    这篇文章主要介绍了用C语言检查两棵树是否相同,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2022-04-04
  • C++如何实现BCD码和ASCII码的相互转换

    C++如何实现BCD码和ASCII码的相互转换

    这篇文章主要介绍了C++实现BCD码和ASCII码互转,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • C语言实现经典扫雷小游戏完整代码(递归展开 + 选择标记)

    C语言实现经典扫雷小游戏完整代码(递归展开 + 选择标记)

    这篇文章主要介绍了C语言小项目之扫雷游戏带递归展开 + 选择标记效果,本代码中,我们用字符 ! 来标识雷,文中附有完整代码,需要的朋友可以参考下
    2022-05-05
  • 一文彻底搞懂IO底层原理

    一文彻底搞懂IO底层原理

    我们今天要给大家讲的底层的IO看上去简单,实则抽象。并且在它之上衍生出了语言层面用于实战的技术,比如我们熟悉的java语言中的NIO或者像Netty这样的框架
    2021-06-06
  • C语言中typedef的用法以及#define区别详解

    C语言中typedef的用法以及#define区别详解

    这篇文章主要给大家介绍了关于C语言中typedef用法以及#define区别的相关资料,typedef 是用来定义一种类型的新别名的,它不同于宏(#define),不是简单的字符串替换。而#define只是简单的字符串替换(原地扩展),需要的朋友可以参考下
    2021-07-07

最新评论