243.回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为

回文链表
。如果是,返回 true ;否则,返回 false

示例 1:

复制代码
输入:head = [1,2,2,1]
输出:true

示例 2:

复制代码
输入:head = [1,2]
输出:false

思路:

  1. 找到前半部分链表的尾节点。
  2. 反转后半部分链表。
  3. 判断是否回文。
  4. 恢复链表。
  5. 返回结果。
cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 //链表逆序(头插法)
 struct ListNode* reverseList(struct ListNode* head)
 {
    struct ListNode* list,*p;
    list=(struct ListNode*)malloc(sizeof(struct ListNode));
    list->next=NULL;//先建立一个带头结点的单链表
    p=head;
    struct ListNode* s;
    while(p!=NULL)
    {
        //头插法
        s=(struct ListNode*)malloc(sizeof(struct ListNode));
        s->val=p->val;
        s->next=list->next;
        list->next=s;
        p=p->next;
    }
    return list->next;
 }
 //找到前半部分链表的尾节点
 struct ListNode* endOfFirstHalf(struct ListNode* head) {
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while (fast->next != NULL && fast->next->next != NULL) {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}
bool isPalindrome(struct ListNode* head) {
    if(head==NULL)
    {
         return true;
    }
    //找到前半部分链表的尾节点并反转后半部分链表
    struct ListNode* firstHalfEnd=endOfFirstHalf(head);
    struct ListNode* secondHalfStart=reverseList(firstHalfEnd->next);
    //判断是否是回文
    struct ListNode* p1=head;
    struct ListNode* p2=secondHalfStart;
    bool result=true;
    while(result &&p2!=NULL)
    {
        if(p1->val!=p2->val)
        {
            result=false;
        }
        p1=p1->next;
        p2=p2->next;
    }
    //还原链表并返回结果
     firstHalfEnd->next = reverseList(secondHalfStart);
     return result;
}
相关推荐
Kalika0-041 分钟前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
代码雕刻家1 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
小字节,大梦想2 小时前
【C++】二叉搜索树
数据结构·c++
我是哈哈hh3 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
丶Darling.3 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo5203 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
Indigo_code4 小时前
【数据结构】【链表代码】合并有序链表
数据结构·windows·链表
jiyisuifeng19914 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
我言秋日胜春朝★4 小时前
【C++】红黑树
数据结构
新晓·故知4 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表