LeetCode 링크드리스트의 회문 구조

연결 목록의 회문

제목 설명

연결 목록의 경우 회문 구조인지 여부를 결정하기 위해 시간 복잡도가 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;
    }
};

추천

출처blog.csdn.net/weixin_50886514/article/details/113529469