02-线性结构2 Reversing Linked List

来源:互联网 发布:淘宝内部优惠券哪个好 编辑:程序博客网 时间:2024/05/24 06:20

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
原创粉丝点击