这道题反而递归的算法比较容易想到了,首先要先递归到链表的末尾,再递归返回时与链表头的元素开始比较。
感觉还有优化的空间,比如当tail和front交汇时停止比较?但是反而递归的算法不太容易操作..
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* func(struct ListNode**front,struct ListNode* tail);
bool isPalindrome(struct ListNode* head) {
struct ListNode* front = head;
struct ListNode* tail = head;
if(head==NULL||head->next==NULL)
return true;
struct ListNode* ret = func(&front,tail);
if(ret)
return true;
else
return false;
}
struct ListNode* func(struct ListNode**front,struct ListNode* tail){ //为了能吧对front的操作贯穿递归调用,而用的指针的指针
struct ListNode* ret=NULL;
if(tail->next){
ret = func(front,tail->next);
if(ret&&tail->val == (*front)->val){
*front=(*front)->next ;
return tail;
}else{
return NULL;
}
}else{
if(tail->val == (*front)->val){
*front=(*front)->next ;
return tail;
}else{
return NULL;
}
}
}