PTA 1025 反轉鏈表(詳解+代碼)

解析:這道題我的思路是先將這些節點按給的頭結點地址開始排序,也就是
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 ;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章