一、题目
给定一个链表L和一个整数K,对链表内的元素以K为基本长度进行翻转。
详细信息可看链接:hhttps://pintia.cn/problem-sets/1340842164139356160/problems/1368396163593801730
二、解法
整了大半天,回头一看,题目意思理解错了.....................
首先把链表的顺序存储起来,然后以K个单位循环翻转链表,翻转一次后,如果链表后面的
元素仍大于K,继续翻转,就是在这坑了。后续不足K个的补到最后,以-1表示链表的结束。
first = list(input().split())
found = []
dict={}
for i in range(int(first[1])):
found.append(list(input().split()))
linkBuild = []
out = []
index = first[0]
while len(found):
# 对链表进行顺序连接
for i in found:
if i[0] == index:
linkBuild.append(i[0])
dict[i[0]]=i[1]
index = i[2]
found.remove(i)
break
# 如果足够K个元素,进行翻转
if len(linkBuild) == int(first[2]) :
linkBuild.reverse()
for i in range(len(linkBuild)):
out.append(linkBuild[i])
linkBuild.clear()
if index == -1:
break
# 不足K个元素的,填补到输出结果后面
for i in range(0, len(linkBuild)):
out.append(linkBuild[i])
# 按照输出规则进行输出,最后以-1表示链表的结束。
for i in range(0, len(out) - 1):
print(out[i], dict[out[i]], out[i + 1])
print(out[-1], dict[out[-1]], -1)
后面两个测试点运行超时,无法通过。
参考别人的C++题解:
链接:https://blog.csdn.net/qq_40991687/article/details/104085351
#include<iostream>
#include<algorithm> // 包含reverse函数
using namespace std;
int main() {
int st,n,m;
cin>>st>>n>>m;
//存储输入的不规则链表
int data[100000],next[100000],list[100000];
for(int i=0; i<n; ++i) {
int temp;
cin>>temp;
cin>>data[temp]>>next[temp];
}
int count=0;//坑。不是所有的数据都有效
// 对链表进行排序
while(st!=-1) {
list[count++]=st;
st=next[st];
}
//以m个元素为单位翻转链表
for(int i=0; i<count-count%m; i+=m)
reverse(list+i,list+i+m);
//输出
for(int i=0; i<count-1; ++i)
printf("%05d %d %05d\n",list[i],data[list[i]],list[i+1]);
printf("%05d %d -1",list[count-1],data[list[count-1]]);
return 0;
}