经典指数          
原因
4549
浏览数
0
收藏数
 

给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为 3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。  输入描述: 每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(5)、以及正整数K(子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。接下来有N行,每行格式为:Address Data Next其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。 输出描述: 对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。 输入例子: 00100 6 400000 4 9999900100 1 1230968237 6 -133218 3 0000099999 5 6823712309 2 33218 输出例子: 00000 4 3321833218 3 1230912309 2 0010000100 1 9999999999 5 6823768237 6 -1

     举报   纠错  
 
切换
1 个答案

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int first = sc.nextInt();

int nc = sc.nextInt();

ArrayList ll = new ArrayList();

int k = sc.nextInt();

//节点地址-节点映射

HashMap map = new HashMap();

while(nc != 0){

int ad = sc.nextInt();

int val = sc.nextInt();

int next = sc.nextInt();

map.put(ad, new Node(ad, val, next));

nc--;

}

sc.close();

//把链表按给出顺序排列,放入集合中

while(first != -1){

Node n = map.get(first);

ll.add(n);

first = n.next;

}

//每k位逆转顺序

for(int i = k; i < ll.size(); i += k){

int l = i-k;

int r = i-1;

while(l < r){

Node t = ll.get(l);

ll.set(l, ll.get(r));

ll.set(r, t);

l++;

r--;

}

}

//输出结果,地址小于5位前面补0

for(int i = 0; i

String str = ""+ll.get(i).address;

String str2 = ""+ll.get(i+1).address;

while(str.length() < 5)

str = "0"+str;

while(str2.length() < 5)

str2 = "0"+str2;

System.out.println(str + " " + ll.get(i).val + " " + str2);

}

String str = ""+ll.get(ll.size()-1).address;

while(str.length() < 5)

str = "0"+str;

System.out.println(str + " " + ll.get(ll.size()-1).val + " -1");

}

static class Node{

public Node(int adr, int v, int next){

address = adr;

val = v;

this.next = next;

}

int address;

int val;

int next;

}

}

 
切换
撰写答案