关闭

02-线性结构2 Reversing Linked List

标签: 数据结构-PAT
411人阅读 评论(0) 收藏 举报
分类:

Given a constant KK and a singly linked list LL, you are supposed to reverse the links of every KK elements on LL. For example, given LL being 1→2→3→4→5→6, if K = 3K=3, then you must output 3→2→1→6→5→4; if K = 4K=4, you must output 4→3→2→1→5→6.
Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive NN (\le 10^5≤10
​5
​​ ) which is the total number of nodes, and a positive KK (\le N≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then NN lines follow, each describes a node in the format:
Address Data Next
where Address is the position of the node, Data is an integer, and Next is the position of the next node.
Output Specification:

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:

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

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

思路:建立双向链表,依次访问直到数目为倒序的次数,若能访问,则用双向链表倒序输出,否则就正序输出。

#include <iostream>
#include <vector>
using namespace std;

typedef struct link
{
    int rank;
    int base_add;
    int next_add;
    link* parent;
    link* child;
}link;

int main()
{
    int begin_add, N, listnum;

    cin >> begin_add;
    cin >> N;
    cin >> listnum;

    vector<pair<int, int>> address(N);//first is base address,second is next address
    int base_add, next_add, rank;
    for (int i = 0; i < N; i++)
    {
        cin >> base_add;
        cin >> rank;
        cin >> next_add;


        address[rank - 1].first = base_add;
        address[rank - 1].second = next_add;
    }

    link* top;
    link* current;
    link* child;
    top = (link*)malloc(sizeof(link));
    current = top;
    top->parent = NULL;
    for (int i = 0; i < N; i++)
    {
        current->base_add = address[i].first;
        current->next_add = address[i].second;
        current->rank = i+1;
        if (i != N - 1)//not the last node
        {
            child = (link*)malloc(sizeof(link));
            current->child = child;
            child->parent = current;
            current = child;
        }
        else
        {
            current->child = NULL;
        }
    }
    int count;
    current = top;
    bool flag = false;
    while (current != NULL)
    {
        count = 1;
        child = current;
        if (flag)
            printf("%05d\n", child->base_add);
        while (current != NULL&&count!=listnum)
        {
            current = current->child;
            count++;
        }
        if (count == listnum)
        {
            child = current;

            for (int j = 0; j < listnum-1; j++)
            {
                //if (child->parent != NULL)
                printf("%05d %d %05d\n", child->base_add, child->rank, child->parent->base_add);
                child = child->parent;
            }
            printf("%05d %d ", child->base_add, child->rank);
            current = current->child;
            flag = true;
        }
        else
        {
            for (int j = 0; j < count-2; j++)
            {
                printf("%05d %d %05d\n", child->base_add, child->rank, child->child->base_add);
                child = child->child;
            }
            printf("%05d %d %d\n", child->base_add, child->rank, -1);
            break;
        }

    }

    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8838次
    • 积分:344
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论