一.链表结构构成以及与ArrayList类的区别
- 和ArrayList不同的是它是链表结构,而ArrayList是顺序结构。我们平常使用的list是一样的,理论上来说一种list就可以完成我们所有的需求。但是它们在运行过程中有区别的,完成需求所需要的资源也不相同,至于什么情况下使用哪种list就看需求和当前情况了。
- 链表解决了这个问题。尽管数组在连续的存储位置上存放对象的引用,但链表却将每个对象存放在独立的结点中。每个结点还存放着序列中下一个结点的引用。在Java程序设计语言中,所有链表实际上都是双向链接的—即每个结点还存放着指向前驱结点的引用。
简单的说,采用该结构的集合,对元素的存取有如下的特点:
-
多个结点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次 类推,这样多个人就连在一起了。
-
查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
-
增删元素快:
-增加元素:只需要修改连接下个元素的地址即可。
-删除元素:只需要修改连接下个元素的地址即可。
LinkedList是一个双向链表,那么双向链表是什么样子的呢,我们用个图了解下
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方 法我们作为了解即可:
public void addFirst(E e) :将指定元素插入此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public E getFirst() :返回此列表的第一个元素。
public E getLast() :返回此列表的最后一个元素。
public E removeFirst() :移除并返回此列表的第一个元素。
public E removeLast() :移除并返回此列表的最后一个元素。
public E pop() :从此列表所表示的堆栈处弹出一个元素。
public void push(E e) :将元素推入此列表所表示的堆栈。
public boolean isEmpty() :如果列表不包含元素,则返回true。
LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList 的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可)
方法演示:
public static void main(String[] args) {
Node node = new Node("周瑜" , null);
node = new Node("曹操" , node);
node = new Node("刘表" , node);
node = new Node("刘备" , node);
node = new Node("张飞" , node);
node = new Node("关羽" , node);
String res = getKey("刘备1", node);
System.out.println(res);
}
二.递归
2.1 概述
-
递归:指在当前方法内调用自己的这种现象。
-
递归的分类:
1.递归分为两种,直接递归和间接递归。
2.直接递归称为方法自身调用自己。
3.间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。 -
注意事项:
1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
3.构造方法,禁止递归
简单递归方法如图:
例一:
public static String getKey(String key ,Node node){
if(node.getData().equals(key)){
return "找到了";
}
if(node.getNode() != null){
return getKey(key , node.getNode());
}else{
return "没有找到";
}
}
例二:
public Object get(Object key){
// 获取 key 余数值
int tmp = key.hashCode() % DEFAULT_INITIAL_CAPACITY;
// 递归算法
Object value = getValue(key, nodes[tmp]);
return value;
}
private Object getValue(Object key ,Node node){
if(node.key.equals(key)){
return node.value;
}
if( node.node != null){
return getValue(key , node.node);
}else{
return null;
}
}