一.hasNext 和 hasNextLine 的区别
-
1.hasNext()方法会判断接下来是否有非空字符.如果有,则返回
true,否则返回
false
-
2.hasNextLine() 方法会根据行匹配模式去判断接下来是否有一行(包括空行),如果有,则返回
true,否则返回
false
比如当前我们有如下测试用例:
7 15 9 5 1
这个测试用例在牛客网上是以文件的形式进行存储的.
而在 linux 系统中文件的结尾会有一个换行符\n,也就是说从System.in输入流中真正读取到的数据流是这样的:
7 15 9 5\n 1
程序在处理完5之后,输入流中就只剩下一个换行符\n了,在处理完5之后while再去进行循环判断,此时hasNext()方法和hasNextLine()方法去判断得到的结果就产生了差异.
- hasNext()方法会认为之后再没有非空字符,会返回一个
false
- hasNextLine() 方法会认为换行符
\n是一个空行,符合行的匹配模式,则会返回一个
true,但实际上由于之后再没有数据了,所以会在读取输入流的时候发生异常,从而导致整个运行报错.
建议方案:
采用hasNextXxxx() 的话,后面也要用nextXxxx():
- 比如前面用
hasNextLine(),那么后面要用
nextLine() 来处理输入;
- 后面用
nextInt() 方法的话,那么前面要使用
hasNext()方法去判断.
二.链表的建立
1.穷举建立链表
因为链表是由一个个节点链接而成,节点是由val和next构成 ,没有节点类这种说法,所以单独建立一个类建立节点.
里面放入两个属性,VAL 和next,
并设置一个构造方法来初始化val(放数据的)
2.建立表类
建立一个函数来初始化节点
节点的NEXT也就是第二个节点的地址,并让第一个节点赋值给头节点
但是注意,随着函数的建立和结束,临时变量都会销毁,但是在堆上建立的对象还是在那里,所以数据和地址都不会销毁,head为什么可以被赋值,因为他属于类里的属性可以在类里任何地方使用,所以除了head其他的都被回收,如果想要找到就要通过head,
3.建立表头
不能在节点类型建立,因为头节点属于链表的属性
4.打印链表
用表头的地址打印,然后通过的表头的NEXT属性找到下一个.然后表头被赋值给下一个,继续,直到表头的next为null
那就意味着走到最后一个位置,但是注意表头也会走不回去,所以就建立一个节点类型的对象,把表头的数据传给他,并随着函数的结束,她会销毁.
class MyNode{
public int val;
public MyNode next;
public MyNode(int a ){
this.val=a;
}
}
class MyLinklist {
public MyNode head ;
public void creatnode(){
MyNode node1=new MyNode(1);
MyNode node2=new MyNode(2);
MyNode node3=new MyNode(3);
MyNode node4=new MyNode(4);
node1.next=node2;
node2.next=node3;
node3.next=node4;
this.head=node1;
}
public void dispaly(){
MyNode cul =head;
while(cul!=null){
System.out.print(cul.val+" ");
cul=cul.next;
}
}
}