체인 테이블두 개의 교환 체인 테이블의 노드

1870 단어

제목.


체인 시계를 정하고 그 중 서로 인접한 노드를 교환하며 교환된 체인 시계를 되돌려줍니다.너는 단순히 노드 내부의 값을 바꾸는 것이 아니라 실제적으로 노드 교환을 해야 한다.
1->2->3->4를 주면 2->1->4->3으로 돌아가야 합니다.주어진 1->2->3->4->5, 당신은 2->1->4->3->5.
제목 출처

분석하다.


내가 처음 생각한 사고방식은 귀속이 아니라 교체였지만 귀속이 비교적 간단하다고 느꼈다.귀속: 우선 귀속 공식을 생각해 내고 제목의 뜻에 따라 서로 인접한 노드를 교환해야 한다.
first->next = swapPairs(second->next); second->next = first; 1. 첫 번째 노드의next 바늘은 두 번째 노드의 다음 노드를 가리킨다.2. 두 번째 노드의next 바늘은 첫 번째 노드를 가리켜야 한다.1과 2의 순서는 바꿀 수 없는데, 왜?2를 먼저 실행하면second->next가 잃어버리기 때문에 1도 오류가 발생합니다
반환값은 노드가 둘씩 교환되기 때문에 당연히 교환 후의 두결점을 되돌려야 한다.
역귀출구if(NULL==head||NULL===head->next) {return head;
이렇게 하면 문제도 해결된다.

코드 구현


귀속
struct ListNode* swapPairs(struct ListNode* head){
    if( NULL == head || NULL == head->next )
    {
        return head;
    }

    struct ListNode *first = head;
    struct ListNode *second = head->next;

    first->next = swapPairs(second->next);
    second->next = first;

    return second;
}

번갈아
struct ListNode* swapPairs(struct ListNode* head){
    //head NULL 
    if( NULL == head ) return head;
    struct ListNode *temp;
    struct ListNode *p,*q,*old;
    old = p = head; // 
    q = head->next; // 

    while( q != NULL && p != NULL )
    {
        temp = q;
        p->next = q->next;/* 1 3*/
        q->next = p;/* 2 1*/

        if( p==head )
        {
            head = temp;
        }
        else
        {
            old->next = temp;
        }

        old = p;
        // 
        p = p->next;
        if( p == NULL )/* p=NULL,q p NULL*/
        {
            q = NULL;
        }
        else
        {
            q = p->next;
        }
    }
    
    return head;
}

좋은 웹페이지 즐겨찾기