学习scala需要java基础吗?
一、学习scala需要java基础吗?
编程基础是要有的,因为看scala的资料大部分都是跟其他语言做比较的,如果没有编程基础将很难看懂比较的意义。
Scala 设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 .NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载 类),允许访问成千上万的高质量类库。
Java语言初学者编写的基础教程,采用秒秒学交互式学习方式,J主要是讲述有关Java面向对象的程序设计所必需的知识和技能,采用交互式软件培训方式,并讲授Java编程语言句法和面向对象的概念,以及Java运行环境的特性,Java类库的使用等。
二、如何使用Java实现单链表?
单链表结构:
Java中单链表采用Node实体类类标识,其中data为存储的数据,next为下一个节点的指针:
package com.algorithm.link;
/**
* 链表结点的实体类
*
*/
public class Node {
Node next = null;//下一个结点
int data;//结点数据
public Node(int data){
this.data = data;
}
}
链表常见操作:
package com.algorithm.link;
import java.util.Hashtable;
/**
* 单链表常见算法
*
*/
public class MyLinkedList {
/**链表的头结点*/
Node head = null;
/**
* 链表添加结点:
* 找到链表的末尾结点,把新添加的数据作为末尾结点的后续结点
* @param data
*/
public void addNode(int data){
Node newNode = new Node(data);
if(head == null){
head = newNode;
return;
}
Node temp = head;
while(temp.next != null){
temp = temp.next;
}
temp.next = newNode;
}
/**
* 链表删除结点:
* 把要删除结点的前结点指向要删除结点的后结点,即直接跳过待删除结点
* @param index
* @return
*/
public boolean deleteNode(int index){
if(indexlength()){//待删除结点不存在
return false;
}
if(index == 1){//删除头结点
head = head.next;
return true;
}
Node preNode = head;
Node curNode = preNode.next;
int i = 1;
while(curNode != null){
if(i==index){//寻找到待删除结点
preNode.next = curNode.next;//待删除结点的前结点指向待删除结点的后结点
return true;
}
//当先结点和前结点同时向后移
preNode = preNode.next;
curNode = curNode.next;
i++;
}
return true;
}
/**
* 求链表的长度
* @return
*/
public int length(){
int length = 0;
Node curNode = head;
while(curNode != null){
length++;
curNode = curNode.next;
}
return length;
}
/**
* 链表结点排序,并返回排序后的头结点:
* 选择排序算法,即每次都选出未排序结点中最小的结点,与第一个未排序结点交换
* @return
*/
public Node linkSort(){
Node curNode = head;
while(curNode != null){
Node nextNode = curNode.next;
while(nextNode != null){
if(curNode.data > nextNode.data){
int temp = curNode.data;
curNode.data = nextNode.data;
nextNode.data = temp;
}
nextNode = nextNode.next;
}
curNode = curNode.next;
}
return head;
}
/**
* 打印结点
*/
public void printLink(){
Node curNode = head;
while(curNode !=null){
System.out.print(curNode.data+" ");
curNode = curNode.next;
}
System.out.println();
}
/**
* 去掉重复元素:
* 需要额外的存储空间hashtable,调用hashtable.containsKey()来判断重复结点
*/
public void distinctLink(){
Node temp = head;
Node pre = null;
Hashtable hb = new Hashtable();
while(temp != null){
if(hb.containsKey(temp.data)){//如果hashtable中已存在该结点,则跳过该结点
pre.next = temp.next;
}else{//如果hashtable中不存在该结点,将结点存到hashtable中
hb.put(temp.data, 1);
pre=temp;
}
temp = temp.next;
}
}
/**
* 返回倒数第k个结点,
* 两个指针,第一个指针向前移动k-1次,之后两个指针共同前进,
* 当前面的指针到达末尾时,后面的指针所在的位置就是倒数第k个位置
* @param k
* @return
*/
public Node findReverNode(int k){
if(klength()){//第k个结点不存在
return null;
}
Node first = head;
Node second = head;
for(int i=0; i