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 ;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章