PAT——1025. 反转链表

给定一个常数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 }

 

posted @ 2017-12-05 10:21  SnailsCoffee  阅读(269)  评论(0编辑  收藏  举报