PTA刷题Basic篇——1025.反转链表——Day(13)

题目描述

在这里插入图片描述
在这里插入图片描述利用每个结点的起始地址和下一个结点的起始地址来反转链表,需要反转的结点数目通过输入指定。

题目分析

我们会先输入这个链表的头结点地址,链表中结点个数N和要反转的结点个数K,即每K个元素发生一次反转,不足K个不发生反转。
然后输入N个结点的起始地址,数据域和指向下一个结点的指针域。每个结点的next指针域一定要匹配到下一个结点的起始地址,这样才表明两个结点是相连的。例如样例中所示,连接顺序应该为1->2->3->4->5->6,且最后一个结点的next域为-1。
那么我们就可以声明一个结点结构体,包括起始地址,数据域和next域,且要声明一个包含结点数组nodes,长度为100010。因为这个数组我们将用结点的起始地址做索引,所以应该声明较大空间。根据起始地址,从这个数组中可以直接取出结点。
我们在输入结点的时候,根据输入的起始地址,将这个结点存在相应的结点数组nodes中。然后根据第一个起始地址去找第一个结点存入vector,再用它的next指针来更新这个起始地址,也就是第二个结点,将这个结点也存入vector中,依次类推直到碰到next指针为-1的结点。
将这个vector每K个元素进行一次反转,反转函数为reverse(algorithm库提供)然后依次将vector中的结点按照指定格式进行输出即可。

代码

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int maxm = 100010;
struct Node{
    int Address;
    int Data;
    int Next;
}nodes[maxm];
int main()
{
    int address;
    int number;//结点个数
    int reverse_pos;
    int count = 0;
    vector<Node>node;
    cin>>address>>number>>reverse_pos;
    for(int i = 0;i < number;i++)
    {
        int add,data,next;
        cin>>add>>data>>next;
        nodes[add].Address = add;
        nodes[add].Data = data;
        nodes[add].Next = next;
    }
    while(address != -1)
    {
        node.push_back(nodes[address]);
        address = nodes[address].Next;
        count++;
    }
    for(int i = 0;i + reverse_pos <= count;i += reverse_pos)
    {
        reverse(node.begin() + i,node.begin() + i + reverse_pos);
    }
    for(int i = 0;i < count - 1;i++)
    {
        node[i].Next = node[i+1].Address;
    }
    //指定最后一位的next为-1
    node[count - 1].Next = -1;
    for (int i = 0;i < count-1; i++){
        printf("%05d %d %05d\n", node[i].Address, node[i].Data, node[i].Next);
    }
    printf("%05d %d %d\n", node[count - 1].Address, node[count - 1].Data, node[count - 1].Next);
    return 0;
}

答题用时18min
Q25——finish√

发布了60 篇原创文章 · 获赞 2 · 访问量 1037

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105633277