OR36. 链表的回文结构
描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
1->2->2->1
返回:true
C++ 解法, 执行用时: 1ms, 内存消耗: 628KB, 提交时间: 2017-10-04
class PalindromeList { public: bool chkPalindrome(ListNode* A) { // write code here if(A==NULL) return false; else if(A->next==NULL) return true; //快慢指针找出中间节点 ListNode* quick=A; ListNode* slow=A; while(quick!=NULL&&quick->next!=NULL) { quick=quick->next->next; slow=slow->next; } //反转 ListNode* p=slow->next; ListNode* p1=p->next; while(p!=NULL) { p->next=slow; slow=p; p=p1; p1=p1->next; } while(A!=slow) { if((A->val)!=(slow->val)) { return false; }else{ if(A->next==slow) { return true; } A=A->next; slow=slow->next; } } return true; } };
C++ 解法, 执行用时: 2ms, 内存消耗: 688KB, 提交时间: 2021-07-26
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };*/ class PalindromeList { public: bool chkPalindrome(ListNode* A) { // write code here if( A == NULL || A->next==NULL) return true; //找到中间节点 struct ListNode* fast,*slow; fast = slow = A; while(fast && fast->next) { fast=fast->next->next; slow=slow->next; } //头插进行逆转 struct ListNode* newHead = NULL; struct ListNode* cur = slow; while(cur) { struct ListNode* next =cur->next; cur->next = newHead; newHead = cur; //更新cur cur=next; } //同时遍历 while(A && newHead) { if(A->val != newHead->val) return false; //只要有一个不同,就不是 回文 A = A->next; newHead = newHead->next; } //循环结束,都相同,说明是回文 return true; } };