题目来源:http://www.patest.cn/contests/pat-b-practise/1025
解题关键:考虑到输入的N个节点,有某个或某些不在链表上,所以最后要输出的总的节点数小于N
给定一个常数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(<= 105)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。
接下来有N行,每行格式为:
Address Data Next
其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。
输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
输入样例:00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218输出样例:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
class Node
{
String address; //地址
int value; //值
String next; //下一个节点的地址
public Node(String address,int value,String next)
{
this.address = address;
this.value = value;
this.next = next;
}
@Override
public String toString() {
return "Node [address=" + address + ", value=" + value + ", next="
+ next + "\n]";
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String start = scanner.next();
int num = scanner.nextInt();
int target = scanner.nextInt();
boolean flag=false;
HashMap<String , Node> list = new HashMap<String , Node>();
ArrayList<Node> cache = new ArrayList<Node>();
StringBuilder sb = new StringBuilder();
//输入num个节点
for(int i=0;i<num;i++)
{
String address = scanner.next();
int value= scanner.nextInt();
String next = scanner.next();
Node node = new Node(address,value,next);
list.put(address, node);
}
//在剩余节点数大于要反转的节点数之前一直循环
while(list.size()>=target)
{
for(int i=0;cache.size()<target;i++) //缓存中的节点数是否已经等于要反转的节点数
{
Node node = list.get(start);
if(node==null) //如果节点为空,表示该节点已不在链表上,跳出循环
{
flag=true;
break;
}
list.remove(start); //删除该即诶单
cache.add(node); //将该节点加入的缓存中
start = node.next; //指向下一个节点
if(cache.size()==target) break; //如果缓存已足够反转,就跳出循环
}
if(flag) break; //如果已有节点为null,则跳出循环
if(cache.size()==target) //缓存是否已经足够
{
while(cache.size()>0) //反转缓存中的所有节点
{
int end = cache.size()-1;
Node node = cache.get(end);
if(sb.length()>0)
sb.append(node.address+"\n");
sb.append(node.address+" ");
sb.append(node.value+" ");
cache.remove(end);
}
}
}
while(cache.size()>0) //缓存未空
{
Node node = cache.get(0);
if(sb.length()>0)
sb.append(node.address+"\n");
sb.append(node.address+" ");
sb.append(node.value+" ");
cache.remove(0);
}
while(list.size()>0) //节点还有剩余
{
Node node = list.get(start);
if(node==null) break;
if(sb.length()>0)
sb.append(node.address+"\n");
sb.append(node.address+" ");
sb.append(node.value+" ");
list.remove(start);
start = node.next;
}
if(sb.length()>0)
sb.append("-1");
System.out.println(sb.toString());
}
/*
00100 7 1
11111 11 22222
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
*
*/
}