解析:這道題我的思路是先將這些節點按給的頭結點地址開始排序,也就是
1 2 3 4 5 6這6個節點。然後倒序前四個存在一個新的集合裏,同時刪除舊集合的前四個節點,然後新集合再添加一遍舊集合全部,這個整個方法外面還有一層循環就是0—K=N/K,因爲總數可能是K的倍數,一遍倒序可能不夠。最後我們再倒序一遍新集合,因爲新集合的最後一個節點的next肯定是-1,所以倒序方便,將最後一個節點的address賦值給下一個節點的next,循環至第一個。
,最後輸出新集合。
package com.zcl.pta2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Pta_1025 {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
String[] split = buf.readLine().split(" ");
String head = split[0];
int N = Integer.parseInt(split[1]);//節點總數
int K = Integer.parseInt(split[2]);//翻轉的節點
List<Node> nodes = new ArrayList<>();
for (int i = 0; i < N; i++) {
String[] split1 = buf.readLine().split(" ");
String address = split1[0];
int data = Integer.parseInt(split1[1]);
String next = split1[2];
nodes.add(new Node(address, data, next));
}
//頭放入list
List<Node> list = new ArrayList<>();
for (int i = 0; i < nodes.size(); i++) {
if (nodes.get(i).address.equals(head)) {
list.add(0, nodes.remove(i));
}
}
//排序
while (!nodes.isEmpty()) {
for (int i = 0; i < nodes.size(); i++) {
Node pernode = list.get(list.size() - 1);//一直取最後一個
if (nodes.get(i).address.equals(pernode.next)) {
list.add(nodes.remove(i));
}
}
}
//翻轉
ArrayList<Node> list2 = new ArrayList<>();
int num = N / K;
for (int i= 0; i <num ; i++) {
for (int j = K - 1; j >= 0; j--) {
list2.add(list.remove(j));
}
}
list2.addAll(list);
//地址互換
String add="-1";
for (int i = list2.size()-1; i >=0 ; i--) {
list2.get(i).next=add;
add=list2.get(i).address;
}
for (Node n : list2) {
System.out.println(n.toString());
}
}
}
class Node {
public String address;
public int data;
public String next;
public Node(String address, int data, String next) {
this.address = address;
this.data = data;
this.next = next;
}
@Override
public String toString() {
return "" +
address +
" " + data +
" " + next ;
}
}