PAT_B_1025_Java(22分)
生活随笔
收集整理的這篇文章主要介紹了
PAT_B_1025_Java(22分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//第六個檢查點,給了你十個點,有可能只把其中的五個點連了起來,如果不考慮這一點就會報錯
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;public class Main {static class Node {//節點類,使用匿名內部類加快速度,能從100ms左右加快到70ms左右public int address;//節點地址public int value;//節點值public int next;//下一個結點地址public Node(int address, int value, int next) {//提供全參構造器this.address = address;this.value = value;this.next = next;}@Overridepublic String toString() {if (this.next != -1)//按照要求格式重寫tostring方法,分情況,方便后續輸出return String.format("%05d", address)+ " " + value+ " " + String.format("%05d", next);elsereturn String.format("%05d", address)+ " " + value+ " " + String.format("%02d", next);}}public static void main(String[] args) throws IOException {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));//使用buffer加快速度String[] buf = bf.readLine().split(" ");int head = Integer.parseInt(buf[0]); //第一個結點的地址int n = Integer.parseInt(buf[1]);//結點總個數int f = Integer.parseInt(buf[2]);//需要翻轉的結點個數Node[] nodes = new Node[100000];//初始數組for (int i = 0; i < n; i++) {buf = bf.readLine().split(" ");int address = Integer.parseInt(buf[0]);int value = Integer.parseInt(buf[1]);int next = Integer.parseInt(buf[2]);nodes[address] = new Node(address, value, next);//放入零散結點}forEachAndReverse(nodes, head, f);//調用遍歷和逆序函數}private static void forEachAndReverse(Node[] nodes, int start, int reverse) {int index = start;//記錄開始節點List<Node> link1 = new LinkedList<>();//鏈表化后的集合List<Node> link2 = new LinkedList<>();//翻轉后的集合link1.add(nodes[index]);//先把頭結點放入while ((index = nodes[index].next) != -1) {//然后賦值,吧頭結點的下一個值給了指針,同時判斷是否是-1結束link1.add(nodes[index]); //如果不是-1結束就繼續添加}int length = link1.size();//記錄有效鏈表的長度,防止出現無效結點int reverseTimes = length / reverse; //翻轉次數,因為不足的部分不翻轉,所以直接取下整//System.out.println(reverseTimes);for (int i = 1; i <= reverseTimes; i++) {//翻轉幾次就轉移幾次for (int j = reverse - 1; j > -1; j--) {link2.add(link1.remove(j));//每次按照逆序把翻轉的部分刪除,返回刪除的元素,同時加到結果集合中}}for (Node node : link1) {link2.add(node);//剩下的部分就是不夠的,不用翻轉,直接按序給到結果集合中}int addressTemp = -1;for (int i = length - 1; i > -1; i--) {link2.get(i).next = addressTemp;//順序已經正確了,現在只是修改next的值,從后往前修改直接覆蓋即可addressTemp = link2.get(i).address;//這就是為什么說是假鏈表的原因}for (Node node : link2) {System.out.println(node);//最后按序輸出結果}}
}
總結
以上是生活随笔為你收集整理的PAT_B_1025_Java(22分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: *PAT_B_1024_Java(20分
- 下一篇: PAT_B_1026_Java(15分)