代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int find_mid(struct ListNode *head,struct ListNode **mid){//使用快慢指针寻找到中间节点
struct ListNode *fast=head;
struct ListNode *slow=head;
while(fast->next&&fast->next->next){
fast = fast->next->next;
slow = slow->next;
}
*mid = slow;
if(fast->next){
return 0;
}else{
return 1;
}
}
struct ListNode *revesal(struct ListNode *head){//采用循环方式反转链表
struct ListNode *newhead = NULL;
struct ListNode *next = NULL;
if(head&&head->next){
next = head->next;
}else{
return head;
}
while(head){
head->next = newhead;
newhead = head;
head = next;
if(head)
next = head->next;
}
return newhead;
}
bool isPalindrome(struct ListNode* head){
if(head->next==NULL)
return true;
struct ListNode *mid=NULL;
struct ListNode *next=NULL;
if(find_mid(head,&mid)){//奇数
next = mid->next;
mid->next = NULL;
next = revesal(next);//反转链表
}else{//偶数
next = mid->next;
mid->next = NULL;
next = revesal(next);
}
while(next){
if(next->val==head->val){
next = next->next;
head = head->next;
}else{
return false;
}
}
return true;
}
注意:
find_mid函数中传入的是**,也就是指针的指针,因为我们要获取的是指针,所以不能传入指针。