1.见到和对称相关的题型要想到栈。
2.计算出链表的长度,将链表的一半放入栈中,如果长度为单数,中间的值直接跳过。
3.栈中的元素出来,与链表后边的元素进行对比。
4.只有当栈中的元素全部出来且p是NULL时,链表才算是回文链表。
注意点
1.p = (stacknode*)malloc(sizeof(stacknode))给他空间
2.如果长度是单数,则正中间的那个数直接跳过
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct stacknode{
int data;
struct stacknode *next;
}stacknode;
int l(struct ListNode *head){
struct ListNode *p = head;
int i=0;
while(p){
i++;
p=p->next;
}
return i;
}
void push(struct stacknode **s, int n){
struct stacknode *p;
p = (stacknode *)malloc(sizeof(stacknode));
p->data = n;
p->next = (*s);
(*s) = p;
}
int pop(struct stacknode **s){
int i;
i = (*s)->data;
*s = (*s)->next;
return i;
}
int empty(struct stacknode *S){
if(S==NULL) return 0;
else return 1;
}
bool isPalindrome(struct ListNode* head){
struct ListNode *p = head;
struct stacknode *S;
S= NULL;
if(head==NULL)
return true;
int length = l(head);
for(int i=0;i<length/2;i++){
push(&S,p->val);
p=p->next;
}
if(length%2 !=0 ) p = p->next;
while(p){
if(p->val == pop(&S))
p=p->next;
else
return false;
}
if(empty(S)==0 && p==NULL) return true;
else return false;
}