1. 程式人生 > >PAT——1025. 反轉連結串列

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 }