首页
学习
活动
专区
圈层
工具
发布
30 篇文章
1
PAT (Basic Level) Practice (中文)1054 求平均值 (20 分)
2
PAT (Basic Level) Practice (中文)1051 复数乘法 (15 分)
3
PAT (Basic Level) Practice (中文)1050 螺旋矩阵 (25 分)
4
PAT (Basic Level) Practice (中文)1046 划拳 (15 分)
5
PAT (Basic Level) Practice (中文)1045 快速排序 (25 分)
6
PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
7
PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)
8
PAT (Basic Level) Practice (中文)1042 字符统计 (20 分)
9
PAT (Basic Level) Practice (中文)1040 有几个PAT (25 分)
10
PAT (Basic Level) Practice (中文)1038 统计同成绩学生 (20 分)
11
PAT (Basic Level) Practice (中文)1036 跟奥巴马一起编程 (15 分)
12
PAT (Basic Level) Practice (中文)1034 有理数四则运算 (20 分)
13
PAT (Basic Level) Practice (中文)1032 挖掘机技术哪家强 (20 分)
14
PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
15
PAT (Basic Level) Practice (中文)1030 完美数列 (25 分)
16
PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
17
PAT (Basic Level) Practice (中文)1028 人口普查 (20 分)
18
PAT (Basic Level) Practice (中文)1027 打印沙漏 (20 分)
19
PAT (Basic Level) Practice (中文)1025 反转链表 (25 分)
20
PAT (Basic Level) Practice (中文)1053 住房空置率 (20 分)
21
PAT (Basic Level) Practice (中文)1024 科学计数法 (20 分)
22
PAT (Basic Level) Practice (中文)1022 D进制的A+B (20 分)
23
PAT (Basic Level) Practice (中文)1049 数列的片段和 (20 分)
24
PAT (Basic Level) Practice (中文)1021 个位数统计 (15 分)
25
PAT (Basic Level) Practice (中文)1048 数字加密 (20 分)
26
PAT (Basic Level) Practice (中文)1019 数字黑洞 (20 分)
27
PAT (Basic Level) Practice (中文)1017 A除以B (20 分)
28
PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
29
PAT (Basic Level) Practice (中文)1015 德才论 (25 分)
30
PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 (20 分)

PAT (Basic Level) Practice (中文)1025 反转链表 (25 分)

1025 反转链表 (25 分)

给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤10​5​​)、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。

接下来有 N 行,每行格式为:

代码语言:javascript
复制
Address Data Next

其中 Address 是结点地址,Data 是该结点保存的整数数据,Next 是下一结点的地址。

输出格式:

对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入样例:

代码语言:javascript
复制
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

输出样例:

代码语言:javascript
复制
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

个人认为是比较难的第五题了~调了半天

有点类似链式前向星,按照地址索引,直到-1为止反转结点的时候要注意更新地址,对于一个结点而言,不变的是它本身的地址,可能变化的是它的下一个地址,还有一个小细节是如果最后剩余不够k个不反转~

代码语言:javascript
复制
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#include<unordered_set>
#define rg register ll
#define inf 2147483647
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define ll long long
#define maxn 300005
#define lb(x) (x&(-x))
const double eps = 1e-6;
using namespace std;
inline ll read()
{
	char ch = getchar(); ll s = 0, w = 1;
	while (ch < 48 || ch>57) { if (ch == '-')w = -1; ch = getchar(); }
	while (ch >= 48 && ch <= 57) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
	return s * w;
}
inline void write(ll x)
{
	if (x < 0)putchar('-'), x = -x;
	if (x > 9)write(x / 10);
	putchar(x % 10 + 48);
}
struct node
{
    ll cur,next,val,add;
}p[maxn],ans[maxn],ans1[maxn],q[maxn];
ll tot;
/*ostream &operator<<(ostream &out,const node &a)
{
    out<<setw(5)<<setfill('0')<<a.cur<<" "<<a.val<<" "<<setw(5)<<setfill('0')<<a.next<<endl;
    return out;
}*/
void display(const node&a)
{
    printf("%05lld %lld %05lld\n",a.cur,a.val,a.next);
}
int main()
{
    ll first,n,k;
    cin>>first>>n>>k;
    for(rg i=1;i<=n;i++)
    {
        ll a,b,c;
        cin>>a>>b>>c;
        p[a].cur=b,p[a].next=c,p[a].add=a;
        q[b].add=a,q[b].val=b,q[b].next=c;
    }
    if(first==-1)
    {
        return 0*puts("-1");
    }
    while(first!=-1)
    {
        ans[++tot].val=p[first].cur;
        first=p[first].next;
    }
    //cout<<tot<<endl;
        for(rg i=1;i<=tot;i+=k)
    {
        if(i+k-1>tot)
        {
            for(rg m=i;m<=tot;m++)
            {
                ans1[m].val=ans[m].val;
            }
            break;
        }
        ll tep=i;
        for(rg j=i+k-1;j>=i;j--)
        {
            ans1[j].val=ans[tep].val;
            tep++;
        }

    }
    /*for(rg i=1;i<=tot;i++)
    {
        cout<<ans1[i].val<<endl;
    }*/
    ll cnt=1,tep=ans1[cnt].val;
   while(cnt<=tot)
    {
        //cout<<tep<<endl;
        ans1[cnt].cur=q[tep].add;
        ans1[cnt].next=q[ans1[cnt+1].val].add;
        tep=q[ans1[cnt+1].val].val;
        if(cnt==tot)
        {
            ans1[cnt].next=-1;
            break;
        }
        cnt++;
    }
        for(rg i=1;i<=tot;i++)
    {
        if(i!=tot)
        display(ans1[i]);
        else
        {
            cout<<setw(5)<<setfill('0')<<ans1[i].cur<<" "<<ans1[i].val<<" "<<-1<<endl;
        }
    }
   	return 0;
}
下一篇
举报
领券