1025. 反转链表 (25)

题目来源:http://www.patest.cn/contests/pat-b-practise/1025

解题关键:考虑到输入的N个节点,有某个或某些不在链表上,所以最后要输出的总的节点数小于N


给定一个常数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(<= 105)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。

输出格式:

对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入样例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;




class Node
{
	String address; //地址
	int	value; //值
	String next; //下一个节点的地址
	public Node(String address,int value,String next)
	{
		this.address = address;
		this.value = value;
		this.next = next;
	}
	@Override
	public String toString() {
		return "Node [address=" + address + ", value=" + value + ", next="
				+ next + "\n]";
	}
	
	
	
	
}



public class Main {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		String start = scanner.next();
		int num = scanner.nextInt();
		int target = scanner.nextInt();
		boolean flag=false;
		HashMap<String , Node> list = new HashMap<String , Node>();	
		ArrayList<Node> cache = new ArrayList<Node>();
		StringBuilder sb = new StringBuilder();
		//输入num个节点
		for(int i=0;i<num;i++)
		{
			String address = scanner.next();
			int value=  scanner.nextInt();
			String next = scanner.next();
			Node node = new Node(address,value,next);
			list.put(address, node);
		}
		//在剩余节点数大于要反转的节点数之前一直循环
		while(list.size()>=target)
		{
			for(int i=0;cache.size()<target;i++)  //缓存中的节点数是否已经等于要反转的节点数
			{
				Node node = list.get(start);
				if(node==null)  //如果节点为空,表示该节点已不在链表上,跳出循环
				{
					flag=true;
					break;
				}
				list.remove(start); //删除该即诶单
				cache.add(node);  //将该节点加入的缓存中
				start = node.next; //指向下一个节点
				
				if(cache.size()==target) break; //如果缓存已足够反转,就跳出循环
				
			}
			if(flag) break; //如果已有节点为null,则跳出循环
			if(cache.size()==target) //缓存是否已经足够
			{
				while(cache.size()>0) //反转缓存中的所有节点
				{
					int end = cache.size()-1;
					Node node = cache.get(end);
					if(sb.length()>0)
						sb.append(node.address+"\n");
				    sb.append(node.address+" ");
				    sb.append(node.value+" ");
					cache.remove(end);
				}
			}
			
			
		}
		while(cache.size()>0) //缓存未空
		{
			
			Node node = cache.get(0);
			if(sb.length()>0)
				sb.append(node.address+"\n");
		    sb.append(node.address+" ");
		    sb.append(node.value+" ");
			cache.remove(0);
		}
	    while(list.size()>0)  //节点还有剩余
	    {
	    	Node node = list.get(start);
	    	if(node==null) break;
	    	if(sb.length()>0)
				sb.append(node.address+"\n");
		    sb.append(node.address+" ");
		    sb.append(node.value+" ");
			list.remove(start);
			start = node.next;
	    }
	    if(sb.length()>0)
	    	sb.append("-1");
	    System.out.println(sb.toString());
		
	}
	/*
00100 7 1
11111 11 22222
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218 
	 * 
	 */


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值