단일 연결 목록이 회문인지 여부 확인 C

러틀

단일 연결 목록이 회문인지 확인하려고합니다. 제약은-알고리즘이 선형 시간과 일정한 공간에 있어야합니다.

내가 사용하는 기본 알고리즘은 다음과 같습니다.

  1. 빠르고 느린 포인터를 사용하여 목록을 두 개로 나눕니다.
  2. 후반부를 제자리에서 뒤집습니다.
  3. 전반과 후반을 비교하십시오.
  4. 원래 목록을 다시 구성
  5. 결과를 반환합니다.

내 구현은 목록에 요소 수가 짝수 일 때 작동하지만 요소 수가 홀수이면 실패합니다.

/*
 * @brief   Checks if a list is a palindrome or not
 */
bool is_palindrome(node *head)
{
    node *first;                /* Points to head node of 1st half */
    node *second;               /* Points to head node of 2nd half */
    node *f_ptr = head;         /* Fast pointer */
    node *s_ptr = head;         /* Slow pointer */
    node *prev = NULL;          /* Previous to slow pointer */
    bool ret = false;           /* Return value */

    while (f_ptr && f_ptr->next && f_ptr->next->next)
    {
        prev = s_ptr;
        s_ptr = s_ptr->next;
        f_ptr = f_ptr->next->next;
    }

    /* List with even number of elements */
    if (!(f_ptr->next->next))
    {
        first = head;
        second = s_ptr->next;
        s_ptr->next = NULL;
        /* Reverse the second half */
        second = reverse_list(&second);
        /* Compare the first & second half */
        ret = are_identical(first, second);
        /* Finally, construct the original list back */
        second = reverse_list(&second);
        s_ptr->next = second;
        print_list(head);
    }
    /* List with odd number of elements */
    if (!(f_ptr->next))
    {
        first = head;
        second = s_ptr->next;
        prev->next = NULL;
        s_ptr->next = NULL;
        /* Reverse the second half */
        second = reverse_list(&second);
        /* Compare the first & second half */
        ret = are_identical(first, second);
        /* Finally, construct the original list back */
        second = reverse_list(&second);
        prev->next = s_ptr; s_ptr->next = second;
        print_list(head);
    }
    return ret;
}

누군가가 홀수 사건을 처리하는 동안 내가 뭘 잘못하고 있는지 알아낼 수 있습니까? 이 프로그램의 전체 구현은 여기 에서 찾을 수 있습니다 .

러틀

버그를 지적 해 주신 s7amuser 에게 감사드립니다 . 다음은 짝수 및 홀수 경우 모두에서 작동하는 구현입니다.

/*
 * @brief   Checks if a list is a palindrome or not
 */
bool is_palindrome(node *head)
{
    node *first;                /* Points to head node of 1st half */
    node *second;               /* Points to head node of 2nd half */
    node *f_ptr = head;         /* Fast pointer */
    node *s_ptr = head;         /* Slow pointer */
    node *prev = NULL;          /* Previous to slow pointer */
    bool ret = false;           /* Return value */

    while (f_ptr && f_ptr->next && f_ptr->next->next)
    {
        prev = s_ptr;
        s_ptr = s_ptr->next;
        f_ptr = f_ptr->next->next;
    }

    /* List with odd number of elements */
    if (!(f_ptr->next))
    {
        first = head;
        second = s_ptr->next;
        prev->next = NULL;
        s_ptr->next = NULL;
        /* Reverse the second half */
        second = reverse_list(&second);
        /* Compare the first & second half */
        ret = are_identical(first, second);
        /* Finally, construct the original list back */
        second = reverse_list(&second);
        prev->next = s_ptr; s_ptr->next = second;
        print_list(head);
    }
    /* List with even number of elements */
    else if (!(f_ptr->next->next))
    {
        first = head;
        second = s_ptr->next;
        s_ptr->next = NULL;
        /* Reverse the second half */
        second = reverse_list(&second);
        /* Compare the first & second half */
        ret = are_identical(first, second);
        /* Finally, construct the original list back */
        second = reverse_list(&second);
        s_ptr->next = second;
        print_list(head);
    }
    return ret;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

단일 연결 목록이 회문인지 확인

분류에서Dev

단일 연결 목록 C, 인쇄

분류에서Dev

C 체크인을위한 단일 연결 목록 표시

분류에서Dev

연결된 목록이 C ++를 사용하여 정렬되었는지 여부를 확인하는 방법은 무엇입니까?

분류에서Dev

C ++에서 정수 단일 연결 목록의 대칭을 확인하는 방법은 무엇입니까?

분류에서Dev

C의 이중 연결 목록 (인쇄)

분류에서Dev

C의 이중 연결 목록 (인쇄)

분류에서Dev

인터넷 연결 사용 가능 여부 확인 C #

분류에서Dev

C의 함수를 사용하여 문자열이 회문인지 확인

분류에서Dev

인덱스 C ++를 사용하여 이중 연결 목록 삭제 노드

분류에서Dev

단일 연결 목록에서 데이터를 인쇄하는 방법

분류에서Dev

Wi-Fi를 통한 인터넷 연결 또는 모바일 데이터 사용 가능 여부 확인

분류에서Dev

파일 목록을 반복하여 내부에 몇 줄이 있는지 확인

분류에서Dev

Arduino Xbee 코디네이터 연결 여부 확인

분류에서Dev

C ++ 단일 연결 목록에서 이중 연결 목록으로 변경

분류에서Dev

C에서 문자열 단일 연결 목록 구현

분류에서Dev

C-재귀를 사용하여 연결된 목록 인쇄

분류에서Dev

일반 연결 목록 인쇄 및 C의 값으로 추가

분류에서Dev

C에서 일반적인 종류의 연결 목록

분류에서Dev

C 연결 목록-파일에 대한 포인터 쓰기

분류에서Dev

C ++의 단일 연결 목록

분류에서Dev

일부 문자열이 목록에 "in"이고 일부는 "not in"인지 확인하는 방법은 무엇입니까?

분류에서Dev

C : 불완전한 유형의 단일 연결 목록에 대한 역 참조 포인터

분류에서Dev

BroadcastReceiver를 사용하여 모바일 데이터가 연결되었는지 확인 | 기계적 인조 인간

분류에서Dev

C의 연결 목록 함수 인수

분류에서Dev

연결된 포인터 목록 C ++

분류에서Dev

연결된 포인터 목록 C ++

분류에서Dev

C의 연결된 목록 / 포인터

분류에서Dev

C에서 연결 목록 인쇄

Related 관련 기사

  1. 1

    단일 연결 목록이 회문인지 확인

  2. 2

    단일 연결 목록 C, 인쇄

  3. 3

    C 체크인을위한 단일 연결 목록 표시

  4. 4

    연결된 목록이 C ++를 사용하여 정렬되었는지 여부를 확인하는 방법은 무엇입니까?

  5. 5

    C ++에서 정수 단일 연결 목록의 대칭을 확인하는 방법은 무엇입니까?

  6. 6

    C의 이중 연결 목록 (인쇄)

  7. 7

    C의 이중 연결 목록 (인쇄)

  8. 8

    인터넷 연결 사용 가능 여부 확인 C #

  9. 9

    C의 함수를 사용하여 문자열이 회문인지 확인

  10. 10

    인덱스 C ++를 사용하여 이중 연결 목록 삭제 노드

  11. 11

    단일 연결 목록에서 데이터를 인쇄하는 방법

  12. 12

    Wi-Fi를 통한 인터넷 연결 또는 모바일 데이터 사용 가능 여부 확인

  13. 13

    파일 목록을 반복하여 내부에 몇 줄이 있는지 확인

  14. 14

    Arduino Xbee 코디네이터 연결 여부 확인

  15. 15

    C ++ 단일 연결 목록에서 이중 연결 목록으로 변경

  16. 16

    C에서 문자열 단일 연결 목록 구현

  17. 17

    C-재귀를 사용하여 연결된 목록 인쇄

  18. 18

    일반 연결 목록 인쇄 및 C의 값으로 추가

  19. 19

    C에서 일반적인 종류의 연결 목록

  20. 20

    C 연결 목록-파일에 대한 포인터 쓰기

  21. 21

    C ++의 단일 연결 목록

  22. 22

    일부 문자열이 목록에 "in"이고 일부는 "not in"인지 확인하는 방법은 무엇입니까?

  23. 23

    C : 불완전한 유형의 단일 연결 목록에 대한 역 참조 포인터

  24. 24

    BroadcastReceiver를 사용하여 모바일 데이터가 연결되었는지 확인 | 기계적 인조 인간

  25. 25

    C의 연결 목록 함수 인수

  26. 26

    연결된 포인터 목록 C ++

  27. 27

    연결된 포인터 목록 C ++

  28. 28

    C의 연결된 목록 / 포인터

  29. 29

    C에서 연결 목록 인쇄

뜨겁다태그

보관