给定一个常数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
1 package com.hone.basical; 2 import java.util.ArrayList; 3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.Scanner; 7 8 /** 9 * 原题目:https://www.patest.cn/contests/pat-b-practise/1025 10 * @author Xia 11 * 错误:部分正确 12 * 核心:用一个HashMap来保存所有的结点,然后再利用List来连接起所有的结点 13 */ 14 public class basicalLevel1025ReverseLinked{ 15 public static void main(String[] args) { 16 Scanner s = new Scanner(System.in); 17 String firstAddress = s.next(); 18 int total = s.nextInt(); 19 int reverNumNode =s.nextInt(); 20 21 //用一个Map来存储所有的链表结点 22 //string表示当前地址,node表示结点(有三个属性) 23 Map<String, Node> nodeMap = new HashMap<String,Node>(); 24 25 for (int i = 0; i < total; i++) { 26 String address = s.next(); 27 int data = s.nextInt(); 28 String nextAddress = s.next(); 29 Node node = new Node(address,data,nextAddress); 30 nodeMap.put(address, node); 31 } 32 33 //现在将存储在map中所有孤零的结点连一起,并且存储在list中 34 List<Node> nodeList = new ArrayList<Node>(); 35 36 String next = firstAddress; //下一个结点是头结点,则说明开头有一个备用的空结点 37 //用while循环将所有的结点都添加到list中 38 while (true) { 39 Node getNode = nodeMap.get(next); 40 nodeList.add(getNode); 41 if (getNode.nextAddress.equals("-1")) { 42 break; 43 }else { 44 next = getNode.nextAddress; 45 } 46 } 47 48 //现在开始操作反转问题 49 for (int i = reverNumNode; i < nodeList.size(); i+=reverNumNode) { 50 int start = i - reverNumNode; 51 int end = i-1; 52 while(start < end){ 53 Node tempNode = nodeList.get(start); 54 nodeList.set(start, nodeList.get(end)); 55 nodeList.set(end, tempNode); 56 start++; 57 end--; 58 } 59 } 60 61 //输出所有的结点 62 for (int i = 0; i < nodeList.size()-1; i++) { 63 Node presentNode = nodeList.get(i); 64 Node nextNode = nodeList.get(i+1); 65 System.out.println(presentNode.address+" "+presentNode.data+" "+ 66 nextNode.address); 67 } 68 69 //输出最后一个结点 70 Node lastNode = nodeList.get(nodeList.size()-1); 71 System.out.println(lastNode.address+" "+lastNode.data+" "+"-1"); 72 } 73 } 74 75 //定义一个结点类 76 class Node{ 77 String address; 78 int data; 79 String nextAddress; 80 81 public Node(String address,int data,String nextAddress){ 82 this.address = address ; 83 this.data = data ; 84 this.nextAddress = nextAddress ; 85 } 86 }