PAT_B_1025_Java(22分)
生活随笔
收集整理的這篇文章主要介紹了
PAT_B_1025_Java(22分)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//第六個(gè)檢查點(diǎn),給了你十個(gè)點(diǎn),有可能只把其中的五個(gè)點(diǎn)連了起來,如果不考慮這一點(diǎn)就會(huì)報(bào)錯(cuò)
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 {//節(jié)點(diǎn)類,使用匿名內(nèi)部類加快速度,能從100ms左右加快到70ms左右public int address;//節(jié)點(diǎn)地址public int value;//節(jié)點(diǎn)值public int next;//下一個(gè)結(jié)點(diǎn)地址public Node(int address, int value, int next) {//提供全參構(gòu)造器this.address = address;this.value = value;this.next = next;}@Overridepublic String toString() {if (this.next != -1)//按照要求格式重寫tostring方法,分情況,方便后續(xù)輸出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]); //第一個(gè)結(jié)點(diǎn)的地址int n = Integer.parseInt(buf[1]);//結(jié)點(diǎn)總個(gè)數(shù)int f = Integer.parseInt(buf[2]);//需要翻轉(zhuǎn)的結(jié)點(diǎn)個(gè)數(shù)Node[] nodes = new Node[100000];//初始數(shù)組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);//放入零散結(jié)點(diǎn)}forEachAndReverse(nodes, head, f);//調(diào)用遍歷和逆序函數(shù)}private static void forEachAndReverse(Node[] nodes, int start, int reverse) {int index = start;//記錄開始節(jié)點(diǎn)List<Node> link1 = new LinkedList<>();//鏈表化后的集合List<Node> link2 = new LinkedList<>();//翻轉(zhuǎn)后的集合link1.add(nodes[index]);//先把頭結(jié)點(diǎn)放入while ((index = nodes[index].next) != -1) {//然后賦值,吧頭結(jié)點(diǎn)的下一個(gè)值給了指針,同時(shí)判斷是否是-1結(jié)束link1.add(nodes[index]); //如果不是-1結(jié)束就繼續(xù)添加}int length = link1.size();//記錄有效鏈表的長(zhǎng)度,防止出現(xiàn)無效結(jié)點(diǎn)int reverseTimes = length / reverse; //翻轉(zhuǎn)次數(shù),因?yàn)椴蛔愕牟糠植环D(zhuǎn),所以直接取下整//System.out.println(reverseTimes);for (int i = 1; i <= reverseTimes; i++) {//翻轉(zhuǎn)幾次就轉(zhuǎn)移幾次for (int j = reverse - 1; j > -1; j--) {link2.add(link1.remove(j));//每次按照逆序把翻轉(zhuǎn)的部分刪除,返回刪除的元素,同時(shí)加到結(jié)果集合中}}for (Node node : link1) {link2.add(node);//剩下的部分就是不夠的,不用翻轉(zhuǎn),直接按序給到結(jié)果集合中}int addressTemp = -1;for (int i = length - 1; i > -1; i--) {link2.get(i).next = addressTemp;//順序已經(jīng)正確了,現(xiàn)在只是修改next的值,從后往前修改直接覆蓋即可addressTemp = link2.get(i).address;//這就是為什么說是假鏈表的原因}for (Node node : link2) {System.out.println(node);//最后按序輸出結(jié)果}}
}
總結(jié)
以上是生活随笔為你收集整理的PAT_B_1025_Java(22分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: *PAT_B_1024_Java(20分
- 下一篇: Win10程序属性没有兼容性选项怎么解决