234. 回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
官方题解:
方法一:将值复制到数组后的双指针法
即:双指针比较两端元素,并向中间移动。分为以下两个步骤:
1.复制链表值到数组列表中。
2.使用双指针法判断是否为回文。
第一步:遍历链表将数值赋值到数组链表中。
CurrentNode指向当前节点,每次迭代向数组添加currentNode.val
并更新currentNode = currentNode.next ,当currentNode == NULL 停止循环
第二步:
最好使用双指针法来检查是否为回文。我们在起点放置一个指针,在结尾放置一个指针,每一次迭代判断两个指针指向的元素是否相同,若不同,返回 false;相同则将两个指针向内移动,并继续判断,直到两个指针相遇。
bool isPalindrome(struct ListNode* head)
{
int vals[50001],vals_num = 0;
//步骤1:复制链表值到数组列表中
while(head!=NULL){
vals[vals_num++] = head->val;
head = head->next;
}
//步骤2:使用双指针法判断是否为回文
for(int i=0,j = vals_num-1;i<j;++i,j--)
{
if(vals[i]!=vals[j])
{
return false;
}
}
return true;
}
方法二:递归
思路:
currentNode指针是先到尾节点,由于递归的特性,从后往前进行比较。
frontPoint 是递归函数外的指针
if(currentNode.val != frontPointer.val) return false;
否则 frontPointer指针向前移动,并返回ture。
struct ListNode* frontPointer;
struct ListNode* frontPointer;
bool recursivelyCheck(struct ListNode* currentNode)
{
if(currentNode!=NULL){
if(!recursivelyCheck(currentNode->next))
{
return false;
}
if(currentNode->val!=frontPointer->val)
{
return false;
}
frontPointer = frontPointer->next;
}
return true;
}
bool isPalindrome(struct ListNode* head){
frontPointer = head;
return recursivelyCheck(head);
}
方法三:快慢指针
不看了,五步,待整理