
请判断一个链表是否为回文链表。示例 1:输入: 1-2输出: false示例 2:输入: 1-2-2-1输出: true思路1.用快慢指针快指针有两步慢指针走一步快指针遇到终止位置时慢指针就在链表中间位置2.同时用pre记录慢指针指向节点的前一个节点用来分割链表3.将链表分为前后均等两部分如果链表长度是奇数那么后半部分多一个节点4.将后半部分反转 得cur2前半部分为cur15.按照cur1的长度一次比较cur1和cur2的节点数值1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/classSolution {public:boolisPalindrome(ListNode* head) {if(headnullptr||head-nextnullptr)returntrue;ListNode* fasthead;//快指针ListNode* slowhead;//慢指针找到链表的中间位置ListNode* prehead;//慢指针的前一个指针用来分割链表while(fastfast-next){//循环条件是fast和fast的下一个节点是否都存在不用写fast!nullptrfast-next!nullptr直接fastfast-nextpreslow;fastfast-next-next;slowslow-next;//perslow; //这句不能放在这这里的slow是slow-next。只能放在slowslow-next的前面。}pre-nextnullptr;//分割链表。per是前半部分链表的最后一个节点所以是per的下一个结点为空不是pernullptrListNode* cur1head;//前半部分的链表ListNode* cur2reverse(slow);//对后半部分的链表进行反转,reverse(ListNode* slow)错误调用不用写类型ListNode*while(cur1){//循环条件是cur是否为空if(cur1-val!cur2-val)// 若有一个不相等则返回falsereturnfalse;cur1cur1-next;// 判断下一个节点cur2cur2-next;//}returntrue;//都等于则true}//反转链表ListNode* reverse(ListNode* head){ListNode* temp;//保存cur的下一个节点,下一次要操作cur-next的节点ListNode* curhead;ListNode* prenullptr;while(cur){tempcur-next;cur-nextpre;precur;curtemp;}returnpre;}};总结本篇文章就到这里了希望能给你带来帮助