题解 | 判断一个链表是否为回文结构
判断一个链表是否为回文结构
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;
}

