02- 선형 구조 3에서에게 연결된 역전 (25 분) (세그먼트 반전 목록 당)

일정한 주어  K 및 단일 연결리스트  L을 경우마다의 링크 역방향 해야하는  에 K 소자  예를 들어 L.를 부여  되는 L 1 → 2 → 6 → 3 → 4 → 5, 만약  K = 3, 그럼 출력해야 3 → 2 → 1 → 6 → 5 → 4; 경우  K는 = 4, 당신이해야 출력 4 → 3 → 2 → 1 → 5 → 6.

입력 사양 :

각 입력 파일은 하나의 테스트 케이스가 포함되어 있습니다. 각 경우에있어서, 첫 번째 행의 첫 번째 노드의 주소를 포함하고, 긍정적 인  N ( 전체 노드의 개수 ≤) 및 포지티브  K ( 하위리스트의 길이 ≤) 반전된다. 노드의 어드레스가 5 자리 부가 아닌 정수이고, NULL은 -1로 표시된다.

이어서  N 라인을 따라 각각의 형식의 노드를 설명

Address Data Next
 

여기서  Address 노드의 위치이며,  Data 는 정수이며,  Next 다음 노드의 위치이다.

출력 사양 :

각각의 경우를 들어, 출력 결과 목록을 연결 명령했다. 각 노드는 행을 점유하고, 입력과 동일한 형식으로 출력된다.

샘플 입력 :

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
 

샘플 출력 :

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

맙소사! 목록 쓰기 일일

 

 

#INCLUDE <iostream> 
#INCLUDE <STDIO.H>
 은 USING  스페이스 STD 단계; 

구조체 노드 
{ 
    int로 상기 민
     INT 다음 단계; // 다음 어드레스 
}리스트 [ 100001 ]; // 10 초와 같은 어드레스 

공간 인쇄 ( INT N-) 
{ 
    IF (N - == - . 1 ) { 
        COUT << - 1. ,
         ; 
    } 
    INT T = 10000 ;
     그동안 (T) 
    { 
        COUT << N- / T;
        N% N = t; 
        t = t / 10 ; 
    } 
} 

INT 의 main () 
{ 
    INT 전나무, N, K; 
    scanf와 ( " % D % D % D " , 전나무, N, K);
    // CIN 전나무 >> >> N >> K; 
    리스트 [ 100000 ] 다음 내용 = 전나무;
    위한 ( INT 난 = 0 ; I <N; ++ I) 
    { 
        INT의 T1, t, T2; // CIN >> >> t >> T1, T2; 
        scanf와 ( " % D % D % D ' , T1, t, T2); 
        목록 [T1].
        리스트 [T1] 다음 내용 = T2; 
    } 
    INT의 P1 =리스트 [전나무] 다음 내용, P2 =리스트 [전나무] 다음 내용, P3 = 전나무, P4 = 100000 ;
    하지만 ( 1 ) 
    { // COUT << 'P4 ='<< P4 << "P3 ="<< P3 << "P2 ="<< P2 << "P1 ="<< P1 << ENDL; 
        INT 플래그 = 1 ;
        위한 ( INT 난 = 1 ; I <K 단계; I ++ ) 
        { 
            경우 (P1 =! - 1 ) 
            { 
                P1 = 리스트 [P1] 다음 내용; 
                리스트 [P2] 다음 내용 = P3;=P2; 
                P2 = P1; 
            } 
            다른 
            { 
                플래그 = 0 ;
                휴식 ; 
            } 
            // COUT << "aaP4 ="<< P4 << "P3 ="<< P3 << "P2 ="<< P2 << "P1 ="<< P1 << ENDL; 
        }
         경우 (플래그) 
        { 
            INT의 Y = 리스트 [P4] 다음 내용; 
            리스트 [P4] 다음 내용 = P3; 
            P3 = Y;
            // COUT << "P3 ="<< P3 << ENDL;
            // 대 (INT J = 1; J <K; ++ J) = P3리스트 [P3] 다음 내용; 
            리스트 [P3] 다음 내용 =PL;
             // 복원 
            P4 = P3, 
            P3 = P2;
             IF (P2 == - 1. ) BREAK ; // 그냥 종료 
            PL = 리스트 [PL] 다음 내용] 
            P2 = 리스트 [P2] 다음 내용;
             // COUT << "P4 ="<< << P4 'P3 = "P3 << <<"P2 = "P2 << <<"경기 수 = "<< ENDL << PL이 
        }
         다른 // 단부 꼬리 움츠림 동작 (갖는다 디버그 : 다단계 위로하는 아 아) 
        {
             while 회 ! (= P3 리스트 [P4] 다음 내용)! // 
            { 
                // 경기 수 = P2;
                P2 = P3;
                P3 = 리스트 [P3] 다음 내용; 
                리스트 [P2] 다음 내용 = P1; 
                P1 = P2; 
            } 
            휴식 ; 
        } 
    } 
    // COUT << ENDL; 
    INT P는 = 100000 ;
    하지만 ( 1 ) 
    { 
        P = 리스트 [P] 다음 내용; 
        (P) 인쇄; 
        COUT << "  " <<리스트 [P] .Num << "  " ; 
        인쇄 (리스트 [P] 다음 내용); 
        COUT << ENDL;
        만약(리스트 [P] 다음 내용 == - 1 ) 체류 ; 
    } 


    반환  0 ; 
}

 

 

 

추천

출처www.cnblogs.com/liuyongliu/p/12466163.html