234. 回文链表

tech2026-01-05  5

题目: 请判断一个链表是否为回文链表。

题解思路:

方法一:暴力法

遍历链表,将链表里元素的值放入数组里面,然后再判断数组里面的数字是不是回文数字。

函数代码一:

class Solution { public: bool isPalindrome(ListNode* head) { //当链表长度为0正确 if(!head) { return true;; } ListNode *p=head; int len=0; vector<int>res; while(p) { res.push_back(p->val); p=p->next; len++; } //当链表长度为1时正确 if(len==1) { return true; } for(int i=0;i<len/2;i++) { if(res[i]!=res[len-i-1]) { return false; } } return true; } };

推荐方法二:双指针+链表翻转 举例:[1->2->3->2->1] 当链表长度为奇数时,fast最后指向1,slow指向3;这时判断fast是否为空,不为空,slow走下一个结点就变为2。slow方向的就是2->1,p方向是2->1(前半部分翻转)

举例:[1->2->2->1] 当链表长度为偶数时,fast最后指向空,slow指向后半部分的2, ;这时判断fast是否为空,为空,slow不走。slow方向的就是2->1,p方向是2->1(前半部分翻转)

函数代码二:

class Solution { public: bool isPalindrome(ListNode* head) { //当链表长度为0和1时都正确 if(!head||!head->next) { return true; } ListNode *pre=NULL; ListNode *slow=head; ListNode *fast=head; ListNode *p=NULL; while(fast&&fast->next) { p=slow; slow=slow->next; fast=fast->next->next; p->next=pre; pre=p; } if(fast) { slow=slow->next; } while(p) { if(p->val!=slow->val) { return false; } p=p->next; slow=slow->next; } return true; } };
最新回复(0)