这是牛客网上的一道题目(不看应该也没关系)Reversing Linked List
第一个代码,可以通过测试,第二个代码运行超时,两个代码非常相似,我分析不出第二个代码哪一部分出了问题。
盼慕友回复。下面是代码:
通过测试的代码:import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
//模拟链表每K位反转,因为输入可能有无效节点,所以先要把所有节点存起来
//使用hashmap存入节点,然后根据首地址一个个读取节点,存入数组,对数组每k位进行反转
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int first=sc.nextInt();
int n=sc.nextInt();
int k=sc.nextInt();
HashMap map =new HashMap();
ArrayList list=new ArrayList();
while(n!=0){//存入数据
int adr=sc.nextInt();
int val=sc.nextInt();
int next=sc.nextInt();
map.put(adr, new Node(adr,val,next));
n--;
}
sc.close();
while(first!=-1){//有序取出元素,过滤掉无用节点
Node node=map.get(first);
list.add(node);
first=node.next;
}
//给每K位排序,排序后第i个节点的Next并没有保存下一个节点信息,但是list已经有序
//直接输出i+1的address即可;
for(int i=k;i<=list.size();i+=k){
int l=i-k;
int r=i-1;
while(l
Node t=list.get(l);
list.set(l,list.get(r));
list.set(r, t);
l++;
r--;
}
}
//输出结果,地址小于5位前面补0
for(int i = 0; i
String str = ""+list.get(i).address;
String str2 = ""+list.get(i+1).address;
while(str.length()
str = "0"+str;
while(str2.length()
str2 = "0"+str2;
System.out.println(str + " " + list.get(i).value + " " + str2);
}
String str = ""+list.get(list.size()-1).address;
while(str.length()
str = "0"+str;
System.out.println(str + " " + list.get(list.size()-1).value + " -1");
}
}
class Node{
int address;
int value;
int next;
public Node(int adr,int v,int ne){
address=adr;
value=v;
next=ne;
}
}
运行超时的代码:import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int firstAddr = in.nextInt();
int n = in.nextInt();
int k = in.nextInt();
//输入数据,存放在HashMap中。
HashMap map = new HashMap();
ArrayList ls = new ArrayList();
for(int i = 0; i
int addr = in.nextInt();
int data = in.nextInt();
int next = in.nextInt();
map.put(addr, new Node(addr, data, next));
}
in.close();
//将属于链表的节点元素放入ArrayList中。
while(firstAddr != -1) {
Node node = map.get(firstAddr);
ls.add(node);
firstAddr = node.next;
}
map.clear();
//给每K个元素排序
for(int i = k; i <= ls.size(); i += k) {
int begin = i - k;
int end = i - 1;
while(begin
Node tmp = ls.get(begin);
ls.set(begin++, ls.get(end));
ls.set(end--, tmp);
}
}
//输出
for(int i = 0; i
System.out.printf("%05d %d %05d\n", ls.get(i).addr, ls.get(i).data, ls.get(i + 1).addr);
System.out.printf("%05d %d %d\n", ls.get(ls.size() - 1).addr, ls.get(ls.size() - 1).data, -1);
}
}
class Node {
// String addr; //使用String类,运行效率低?醉了o(╯□╰)o。
int addr;
int data;
int next;
// String next;
public Node(int addr, int data, int next) {
this.addr = addr;
this.data = data;
this.next = next;
}
}