题解 | 判断一个链表是否为回文结构

判断一个链表是否为回文结构

https://www.nowcoder.com/practice/3fed228444e740c8be66232ce8b87c2f

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 the head
 * @return bool布尔型
 */
#include <stdbool.h>
#include <stdlib.h>
struct ListNode* reverse(struct ListNode* head){//反转链表
    struct ListNode *cur=head;
    struct ListNode *pre=NULL;
    while(cur!=NULL){
        struct ListNode *temp=cur->next;
        cur->next=pre;
        pre=cur;
        cur=temp;
    }
    return pre;
}

bool isPail(struct ListNode* head ) {
    // write code here
    if(head==NULL) return true;
    struct ListNode *fast=head,*slow=head;
    while(fast->next!=NULL && fast!=NULL){//注意!!!当链表长度为偶数时,此时fast指针可能指向NULL,但fast->next会访问空指针,引发崩溃
        fast=fast->next->next;//fast指针每次比slow指针多走一步,到尾指针时slow刚好走到中点
        slow=slow->next;
    }
    struct ListNode *reverseHalf=reverse(slow);//从原链表的中间节点开始反转,作为一个新的链表再与原链表进行比较。这里注意!!!不可直接将反转后的链表直接接在原链表后,这将导致原链表成环。
    struct ListNode *H1=head,*H2=reverseHalf;
    while(H2!=NULL){
        if(H1->val!=H2->val) return false;
        else{
            H2=H2->next;
            H1=H1->next;
        }
    }
    return true;
}

全部评论

相关推荐

04-13 09:56
已编辑
嵌入式工程师
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务