Java自学笔记--链表(超全面解析)

链表个内容,非常基础也非常重要,希望看了本篇博客的读者可以有所收获!


一、容器

1、什么是容器呢?

顾名思义,容器就是一个用来容纳对象储存对象的器具(container),在我我们Java中,容器并不是一个语法概念而是一个设计上的术语。

2、如何使用?

以数组容器为例,我们可以通过操作来为数组插入或是删除对应的对象。

3、具体操作

现在的情况:有四个座位(数组的容量为4),前三个座位分别坐着张三、李四、王五,这时新来了一个隔壁老王,他想坐在张三旁边。

在隔壁老王来之前,四个座位的情况为张三,李四,王五,空
隔壁老王来了之后应该变为张三,隔壁老王,李四,王五

为了实现这一变化,需要王五往后挪一个位置,李四往后挪一个位置,为隔壁老王坐在张三身旁创造机会!但是这样操作的代码实现,会稍微复杂,当人数更多的时候,代码将更为复杂。

除此之外数组容器容量固定,无法扩展的缺点也是无可避免的,在设置数组的时候,既不能设置的太大,也不能设置的太小,很难确定。

面对这些问题,我们总不能去忽略不管吧,所以我们应该如何解决这种问题呢?接下来我们所讲的链表可以很好的帮助我们解决这个问题!

二、链表

1、定义

链表(Linked List),一种组织数据的方式,是一种以链状的形式串联起来的队列
节点:链表里面的每一个对象
链表头:链表中最前面的那个节点

2、链表的初步理解

下面我们将以一个比较形象的方法来介绍链表
这里有四只猴子排城一对,每个猴子握住前一个猴子的尾巴于是这四个猴子就构成了一个链表
抓住尾巴前(松散)
在这里插入图片描述
抓住尾巴后(紧密联系)
!](https://img-blog.csdnimg.cn/20200803110909924.png)

代码表示链表

public class Monkey
{
	public int id;//编号
	public String name;//名字
	public Monkey next//后面的猴子,为null的话表示后面没猴子了
}
public class Test
{
	public static void main(String[] args)
	{
		//创造四只猴子
		Monkey m1 =  new Monkey(100,"圆圆");
		Monkey m2 =  new Monkey(101,"芳芳");
		Monkey m3 =  new Monkey(103,"角角");
		Monkey m4 =  new Monkey(104,"朱朱");
		//将猴子的尾巴连起来
		m1.next = m2;
		m2.next = m3;
		m3.next = m4;
		m4.next = null;
	}
}

在这里插入图片描述

我们会发现每个monkey会出现一种链状的结构

3、链表的遍历

public class Test
{
	public static void main(String[] args)
	{
		//创造四只猴子
		Monkey m1 =  new Monkey(100,"圆圆");
		Monkey m2 =  new Monkey(101,"芳芳");
		Monkey m3 =  new Monkey(103,"角角");
		Monkey m4 =  new Monkey(104,"朱朱");
		//将猴子的尾巴连起来
		m1.next = m2;
		m2.next = m3;
		m3.next = m4;
		m4.next = null;
		//遍历
		Monkey node = m1;
		while( nodee !=null)
		{
			System.out.println("链表中的节点" + node);
			node = node.next;
		}
	}
}

运行结果如下
在这里插入图片描述
经过上面的讲解,博主相信各位读者已经对链表有了一个比较形象的理解了。然后我们下面,将一起去学习插入和删除节点

三、插入和删除节点

下面我们继续通过monkey类来更好地学习节点的插入和删除

1、插入节点

方式一:附加到末尾

public class Test
{
	public static void main(String[] args)
	{
		//创造四只猴子
		Monkey m1 =  new Monkey(100,"圆圆");
		Monkey m2 =  new Monkey(101,"芳芳");
		Monkey m3 =  new Monkey(103,"角角");
		Monkey m4 =  new Monkey(104,"朱朱");
		
		//将猴子的尾巴连起来
		m1.next = m2;
		m2.next = m3;
		m3.next = m4;
		m4.next = null;
		//创建新的猴子
		Monkey m5 =  new Monkey(105,"花花");
		//找到尾节点
		Monkey tail = m1;
		while(true)
		{
			if(tail.next==null)break;
			else tail=tail.next;
		}
		tail.next=m5;
		//遍历
		Monkey node = m1;
		while( nodee !=null)
		{
			System.out.println("链表中的节点" + node);
			node = node.next;
		}
	}
}

方式二:插入到中间位置

将猴子m5插入到头结点的后面

public class Test
{
	public static void main(String[] args)
	{
		//创造四只猴子
		Monkey m1 =  new Monkey(100,"圆圆");
		Monkey m2 =  new Monkey(101,"芳芳");
		Monkey m3 =  new Monkey(103,"角角");
		Monkey m4 =  new Monkey(104,"朱朱");
		
		//将猴子的尾巴连起来
		m1.next = m2;
		m2.next = m3;
		m3.next = m4;
		m4.next = null;
		//创建新的猴子
		Monkey m5 =  new Monkey(105,"花花");
		//找到头结点
		Monkey head = m1;
		m5.next=m1.next;//原来m1后面的猴子抓住m5的尾巴
		m1.next=m5;//m5抓住m1的尾巴
		//遍历
		Monkey node = m1;
		while( nodee !=null)
		{
			System.out.println("链表中的节点" + node);
			node = node.next;
		}
	}
}
方式三:插入到指定位置

将m5插入到id为102的猴子之后

public class Test
{
	public static void main(String[] args)
	{
		//创造四只猴子
		Monkey m1 =  new Monkey(100,"圆圆");
		Monkey m2 =  new Monkey(101,"芳芳");
		Monkey m3 =  new Monkey(103,"角角");
		Monkey m4 =  new Monkey(104,"朱朱");
		
		//将猴子的尾巴连起来
		m1.next = m2;
		m2.next = m3;
		m3.next = m4;
		m4.next = null;
		//创建新的猴子
		Monkey m5 =  new Monkey(105,"花花");
		//找到对应节点
		Monkey node = m1;
		while(node!=null)
		{
			if(node.id=102) 
			{
				m5.next=node.next;
				node.next=m5;
				break;
			}
			else
			{
				node=node.next;
			}
		}
		
		//遍历
		Monkey node = m1;
		while( nodee !=null)
		{
			System.out.println("链表中的节点" + node);
			node = node.next;
		}
	}
}

2、删除节点

删除节点思想和增添一样,只需要将想要删除的节点的前一个节点的next和想要删除的节点的后面的那个节点连接即可

下面我们思考,到底应该如何更好地删除或是增加一个头结点呢?

为了解决这个问题,我们引入了有头链表

四、有头链表

有头链表我们可以形象的看成设定一个石猴来当做一群猴子的头结点
在这里插入图片描述

1.定义

有头链表:用一个固定的假节点来充当头结点,此节点不算做链表长度,仅用于优化算法

由于内容并不是特别重要,但是我们不在这里进行特别的叙述

五、数组链表ArrayList

1、ArrayList的简单使用

ArrayList是一个容器,它可以存储任何对象(我们只需要知道如何使用即可,不需要关心其内部的实现)
在使用之前,我们需要导入ArrayList包

ArrayList相当于动态数组
ArrayList a = new ArrayList();

三个基本功能(简单介绍):
(1)添加对象add: a.add(object)
(2)删除对象remove: a.remove(想要删除的对象的位置)
(3)遍历像数组一样按照索引遍历

for(int i=0;i<a.size();i++)
{
	Student s =(Student)a.get(i)//需要将a的对象类型转换为对应的类型
	System.out.println("遍历得:"+s);
}

初学者大致了解以上的简单介绍即可,但是为了能够更好的介绍ArrayList这一工具类的作用,下面博主将更加详细地来介绍一下ArrayList的用法

2、ArrayList的详细介绍

(一)ArrayList的添加方法

(1)按照顺序向ArrayList中添加数据
语法:list.add(object);
代码示例:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list = new ArrayList();
		list.add(1);
		list.add(2);
		System.out.println ("按照顺序添加 "+list);

	}
}

运行结果:
在这里插入图片描述

(2)在第N个数据后面添加一个数据
语法:list.add(index, element);
注意: ArrayList中必须有足够多的数据。
如果ArrayList中没有任何数据,这个时候使用list.add(index, element);;就会出现java.lang.IndexOutOfBoundsException异常。
代码示例:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list = new ArrayList();
		list.add(1);
		list.add(2);
		System.out.println ("按照顺序添加 "+list);
		list.add(1,"add");
		System.out.println("在第一个元素后面添加一个字符串add"+list);
	}

}

运行结果
在这里插入图片描述

(3)将一个ArrayList中的所有数据添加到另外一个ArraList中
代码示例:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list1 = new ArrayList();
		list1.add(1);
		list1.add(2);
		ArrayList list2 = new ArrayList();
		list2.add("a");
		list2.add("b");
		list1.addAll(list2); 
		System.out.println ("将list2的内容全部加到list1中"+list1);
		
		
	}

}

运行结果:
在这里插入图片描述
(4)将一个ArrayList中的所有数据添加到另外一个ArraList中的第N个元素之后。
代码示例:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list1 = new ArrayList();
		list1.add(1);
		list1.add(2);
		ArrayList list2 = new ArrayList();
		list2.add("a");
		list2.add("b");
		list1.addAll(2,list2); 
		System.out.println ("将list2中的全部数据添加到list1中的第2个元素之后:"+list1);
		
		
	}

}

运行结果:
在这里插入图片描述

(二)ArrayList的删除方法

(1)按照位置删除单个数据
语法: list.remove(index);
注意: 位置是从0开始(0、1、2、3…)
代码示例:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list = new ArrayList();
		list.add(1);
		list.add(2);
		list.add(3);
		
		list.remove(0);

		System.out.println ("将list中第1个数据删除:"+list);
	}

}

运行结果:
在这里插入图片描述
(二)按照内容删除单个数据
代码示例:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list = new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		
		list.remove("a");
		System.out.println ("将list中的a:"+list);
	}

}

运行结果:
在这里插入图片描述
注意!!!: 对于诸如int,String这样的原始类型数据是可通过remove来删除的,但是对于那些比较复杂的对象,如自己编写的类的对象,需要重写equals方法,否则remove方法无法匹配删除。

(三)清空ArrayList
语法: ist.clear();
代码实现:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list = new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		
		list.clear();
		System.out.println ("将list中的a:"+list);
	}

}

运行结果:
在这里插入图片描述

(三)ArrayList的修改方法

修改指定位置的数据
注意: 位置是从0开始(0、1、2、3…)
代码示例:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list = new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		
		list.set(0, "我被修改了!!!");
		System.out.println ("将list中第1个元素修改:"+list);
	}

}

运行结果:
在这里插入图片描述

(四)ArrayList的查询方法

获取指定位置的数据:

注意: 位置从0开始计算(0、1、2、3…)

代码实现:

package ArrayList;

import java.util.ArrayList;

public class ArrayListTest
{

	public static void main(String[] args)
	{
		ArrayList list = new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		
		String str = (String) list.get(0);
		System.out.println ("获取list中第1个元素:"+str);
	}

}

运行结果:
在这里插入图片描述


以上就是本篇博客的全部内容啦,如果有什么需要修改或是出现错误的地方希望发现的朋友及时在留言区评论,以便萌新博主可以及时修改不足之处内容。
最后,希望本篇博客能对你的学习与理解有所帮助,让我们共同进步!!!

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页