判断回文链表

解决问题运用到的知识点:

        反转链表,快慢指针遍历确认中点,函数调用,函数参数

解决问题思路(最优解):

  1. 运用快慢指针查找链表中点
  2. 从中点将链表分成两个链表,分别为链表1和链表2
  3. 将链表2(原链表的后半部分)反转成链表3
  4. 比较链表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学习总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StudyFirst1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值