前言:
此篇是针对链表的经典练习题。
问题描述:
给定一个链表,请判断该链表是否为回文结构。
回文是指该字符串正序逆序完全一致。
如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
问题解析:
一共为两个步骤:
①复制链表值到数组列表中。
②使用双指针法判断是否为回文。
第一步,我们需要遍历链表将值复制到数组列表中。我们用 p 指向当前节点。每次迭代向数组添加 p->val,并更新 p = p->next,当 p = null 时停止循环。
执行第二步的最佳方法取决于你使用的语言。最好使用双指针法来检查是否为回文。我们在起点放置一个指针,在结尾放置一个指针,每一次迭代判断两个指针指向的元素是否相同,若不同,返回 false;相同则将两个指针向内移动,并继续判断,直到两个指针相遇。
在编码的过程中,注意我们比较的是节点值的大小,而不是节点本身。正确的比较方式是:node_1.val == node_2.val,而 node_1 == node_2 是错误的。
代码实现:
bool isPalindrome(struct ListNode* head) {
int vals[100], num = 0;
struct ListNode*p=head->next;
while (p) {
vals[num++] = p->val;
p = p->next;
}
for(int i=1;i<=num/2;i++){
if(vals[i-1]!=vals[num-i]){
return false;
}
}
return true;
}