给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]输出:true
示例 2:
输入:head = [1,2]输出:false
提示:
- 链表中节点数目在范围[1, 105] 内
- 0 <= Node.val <= 9
题解
暴力法
定义一个100001大的数组,对链表进行遍历,获得长度,并且将每一个数据域都写入数组,开始判断数组是否对称,如果不对称就返回false结束
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head){
struct ListNode* p = head;
int len = 0;
int q[100001];
while(p){
len++;
q[len] = p->val;
p = p->next;
}
for(int i = 1; i <= len/2; i++){
if(q[i] != q[len-i+1]) return false;
}
return true;
}
双指针法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head){
struct ListNode* p = head;
int len = 0;
int q[100001];
while(p){
q[len] = p->val;
len++;
p = p->next;
}
int i = 0,j = len-1;
while(i<j){
if(q[i]!=q[j]) return false;
i ++;
j --;
}
return true;
}