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

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true
思路:利用快慢双指针+反转半链表+匹配后半链表
注意:当链表为空的时候也是回文链表。当链表是奇数个是如1->1->2->1->1->NULL 在slow应该指向2,fast应该指向最后的1,翻转完2之前的链表此时prev指向1,
所以在匹配之前应该把slow往后移1格,然后根据while(prev!=NULL)匹配。
bool isPalindrome(struct ListNode* head){
    //排除特殊情况
 if(head == NULL||head->next==NULL)
 return true ;
 if(head->next->next==NULL)
 {
    if(head->val==head->next->val)
    return true ;
    else
    return false ;
 }
 //定义快慢双指针,当快指针移动完毕时,慢指针刚好指向链表中间
 struct ListNode* slowp=head->next ;//每次移动一格
 struct ListNode* fastp=head->next->next ;//每次移动两格
 while(fastp!=NULL && fastp->next!=NULL)
 {
    slowp=slowp->next ;
    fastp=fastp->next->next;
 }
 //然后看可以翻转中部之前的链表,以便于后续比较
 struct ListNode* prev =NULL ;
 struct ListNode* Temp =NULL ;
 struct ListNode* curr =head;
 //翻转
 while(curr!=slowp)
 {
    Temp =curr->next ;
    curr->next =prev ;
    prev = curr ;
    curr = Temp ;
 }
 //奇数个的时候不需要对比中间的slow所以后移一格
  if(fastp !=NULL && fastp->next==NULL)
 {
    slowp=slowp->next ;
 }
  //回文匹配
    while(prev!=NULL)
    {
        if(prev->val != slowp->val)
        return false ;
        prev=prev->next;
        slowp=slowp->next;
    }
    return true;
  
}
 

C语言回文链表的更多相关文章

  1. leetcode面试题 02.06. 回文链表,解题心路

    目录 leetcode面试题 02.06. 回文链表,解题心路 1.题目描述 2.java语言题解一 3.java语言题解二 4.C语言题解一 leetcode面试题 02.06. 回文链表,解题心路 ...

  2. [LeetCode] Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time ...

  3. [CareerCup] 2.7 Palindrome Linked List 回文链表

    2.7 Implement a function to check if a linked list is a palindrome. LeetCode上的原题,参见我之前的博客Palindrome ...

  4. lintcode 中等题:Palindrome Linked List 回文链表

    题目 回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 解题 法一: 再定义一个链表,存放链表反转的 ...

  5. [Swift]LeetCode234. 回文链表 | Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  6. Leetcode:234 回文链表

    leetcode:234 回文链表 关键点:请判断一个链表是否为回文链表.示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true. ...

  7. 判断回文字符串、回文链表、回文数(python实现)

    所谓回文字符串,就是正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.即是对称结构 判断回文字符串 方法一: def is_palin ...

  8. 如何判断一个单向链表是否为回文链表(Palindrome Linked List)

    题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案 ...

  9. 【leetcode 简单】 第六十七题 回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...

随机推荐

  1. winform重绘控件边框

    首先添加一个用户控件 对于重绘边框有三个需要考虑的东西 1:是否显示边框 2:边框颜色 3:边框宽度 所以定义三个私有变量 /// <summary>/// 是否显示边框/// </ ...

  2. 6.python设置代理和添加镜像源介绍

    为什么要修改镜像源? 一般使用python安装库,会用到pip install xxx 指令或者conda install xxx指令,因为pip和conda默认国外镜像源,这时会在Python的官方 ...

  3. 树莓派搭载CentOS7系统初始配置

    系统属性: 树莓派型号:3b SD:32GB 系统:CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1908-sda.raw 开机配置: 连接树莓派: 配件 ...

  4. 五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)

    7.JavaScript语言实现 7.1.用ES6语法编写顺序表类 //1.创建类 class MyList { //1. initList(&L):初始化表.构造一个空的线性表.放回值应该是 ...

  5. python神器pycharm的安装

    1.下载PyCharm 官网下载:http://www.jetbrains.com/pycharm/download/#section=windows百度网盘下载:https://pan.baidu. ...

  6. 循环删除List集合的元素

    之前在使用list集合循环删除元素的时候,竟然出现了集合内的元素不能删除成功的问题,之后整理了一下,发现大有玄机! 1.如果指定了list的size大小,会出现下标越界异常 List<Strin ...

  7. 《Javascript DOM编程艺术》学习笔记 第1-6章

    第1章 Javascript简史 Javascript是Netspace公司与Sun公司合作开发的,Javascript 1.0版于1995年推出. 为与微软公司竞争,Netspace公司和Sun公司 ...

  8. Sikerio --《只狼》

    “狼啊,替我断绝不死吧”

  9. JS函数深入

    函数的本质是对象 三种定义方式 1.  字面量=function声明 function add() { // body... } add(); 2.  var赋值表达式 var add = funct ...

  10. ng-做一个简单的通讯录--学习使用路由和HTTP

    app.module import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@ang ...