PAT (고급 레벨) 연습 1074은 목록 (25 점) [목록] 링크 역전

일정을 감안할 때 K 케이 와 단독으로 연결리스트 L , 당신은 모든의 역방향 링크로되어있다 K 케이 의 요소 L . 예를 들어, 주어진 L 존재 1 2 3 4 5 6 1 → 2 → 3 → 4 → 5 → 6 , 만약 K = 3 K = 3 , 당신은 출력해야 3 2 1 6 5 4 3 → 2 → 1 → 6 → 5 → 4 ; 만약 K = 4 K = 4 , 당신이해야 출력 4 3 2 1 5 6 4 → 3 → 2 → 1 → 5 → 6 .

입력 사양 :

각 입력 파일은 하나의 테스트 케이스가 포함되어 있습니다. 각 경우에있어서, 첫 번째 행은 제 노드 양의 주소를 포함 N ( 1 0 5 ) N (≤10 ^ 5) 전체 노드의 수, 및 포지티브 이는 K ( N ) K (≤N) 하위리스트의 길이가 반전된다. 노드의 어드레스가 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 <algorithm>
#include <iostream>

using namespace std;

struct node {
    int address, data, next;
} nodes[100005], list[100005];

int main() {
    int head, n, k, addr;
    cin >> head >> n >> k;

    for (int i = 0; i < n; ++i) {
        cin >> addr;
        nodes[addr].address = addr;
        cin >> nodes[addr].data >> nodes[addr].next;
    }

    int len = 0;
    for (int now = head; now != -1; now = nodes[now].next)  // 获得链表
        list[len++] = nodes[now];
    for (int i = k; i <= len; i += k)  // 分组倒置
        reverse(list + i - k, list + i);
    for (int i = 0; i < len - 1; ++i)
        printf("%05d %d %05d\n", list[i].address, list[i].data, list[i + 1].address);
    printf("%05d %d -1\n", list[len - 1].address, list[len - 1].data);
}
发布了184 篇原创文章 · 获赞 19 · 访问量 2万+

추천

출처blog.csdn.net/Exupery_/article/details/104227210