题目描述
利用每个结点的起始地址和下一个结点的起始地址来反转链表,需要反转的结点数目通过输入指定。
题目分析
我们会先输入这个链表的头结点地址,链表中结点个数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√