연결 목록의 회문
제목 설명
연결 목록의 경우 회문 구조인지 여부를 결정하기 위해 시간 복잡도가 O (n)이고 추가 공간 복잡도가 O (1) 인 알고리즘을 설계하십시오.
연결 목록의 헤드 포인터 A가 주어지면 회문인지 여부를 나타내는 bool 값을 반환하십시오. 링크 된 목록의 길이가 900보다 작거나 같은지 확인하십시오.
예제 1
1->2->2->1
예제 2
1->2->3->4->5->4->3->2->1
언어 : C 언어
아이디어 분석
회문 구조는 실제로 중간을 기준으로 대칭 인 연결 목록입니다. 빠르고 느린 포인터 방법을 사용하여 중간 번호를 찾을 수 있습니다. 노드 수가 짝수이면 중간에있는 두 번째 번호입니다. 시간, 느린 포인터가 가리키는 노드는 중간 노드이고 노드는 연결 목록의 끝으로 반전 된 다음 반전 된 노드와 헤드 노드는 한쪽이 비어있을 때까지 하나씩 비교됩니다.
다이어그램은 다음과 같습니다.
암호
class PalindromeList
{
public:
bool chkPalindrome(ListNode* A)
{
//求中间节点
ListNode* fast = A;
ListNode* slow = A;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
//逆置
ListNode* tem = slow;//保存slow位置,给p
slow = NULL;//制空slow,因为最后一个节点要指向
ListNode* p = tem;
ListNode* p1 = p->next;
while(p)
{
p->next = slow;
slow = p;
p = p1;
//防止p1=NULL还求next
if(p1)
{
p1 = p1->next;
}
}
//判断前后是否相等
while(A && slow)
{
if(A->val == slow->val)
{
A = A->next;
slow = slow->next;
}
else
{
return false;
}
}
return true;
}
};