解决问题运用到的知识点:
反转链表,快慢指针遍历确认中点,函数调用,函数参数
解决问题思路(最优解):
- 运用快慢指针查找链表中点
- 从中点将链表分成两个链表,分别为链表1和链表2
- 将链表2(原链表的后半部分)反转成链表3
- 比较链表1和链表3
具体实现框架:
class Solution { public: ListNode *FindMid(ListNode* head){ ListNode *slow=head; //慢指针 ListNode *fast=head; //快指针 while(fast->next&&fast->next->next){ slow=slow->next; fast=fast->next->next; }return slow; } ListNode *RevceList(ListNode* head){ ListNode *cur=head; ListNode *pre=nullptr; //反转链表 while(cur!=nullptr){ ListNode *tmp=cur->next; cur->next=pre; pre=cur; cur=tmp; } return pre; } bool IsSame(ListNode* l1,ListNode* l2){ ListNode *p1=l1; ListNode *p2=l2; while(p2){ if(p1->val!=p2->val) {return false;} p1=p1->next; p2=p2->next; } return true; } bool isPalindrome(ListNode* head) { if(head==nullptr){ return true; } //查找中点函数 ListNode *mid=FindMid(head); //定义2个链表 ListNode*l1 =head; ListNode*l2 =mid->next; //反转后面的链表 l2=RevceList(l2); return IsSame(l1,l2); } };
运行时遇到的问题:
反复检查后发现问题分别是:
1.超出运行时间
原因:快慢指针判断中点时,while循环条件错误
原:
while(fast!=nullptr&&slow!=nullptr)
改后:
while(fast->next&&fast->next->next)
借鉴别人的写的,为什么这样就可以暂时不清楚,等待明天学习完善!
2.测试用例【1,2】无法通过;
原因:
1.反转链表部分错误,代码可以编译通过,但是语句逻辑错误;
2.指针定义错误,指针指向进行时缺少了关键的一步。
原错误代码:
ListNode *RevceList(ListNode* head){
ListNode *pre=head;
ListNode *cur=nullptr;
//反转链表
while(cur!=nullptr){
ListNode *tmp=cur->next;
pre=cur;
cur=tmp;
}
return cur;
}
正确代码:
ListNode *RevceList(ListNode* head){ ListNode *cur=head; ListNode *pre=nullptr; //反转链表 while(cur!=nullptr){ ListNode *tmp=cur->next; cur->next=pre; pre=cur; cur=tmp; } return pre; }
原错误代码是根据昨天的记忆写的,看来还是不能凭记忆写代码,需要理清逻辑结构再写代码,逻辑上的错误是难以察觉的。
2023/5/31学习总结