数据结构——链表(单向链表)

数据结构——链表(单向链表)

前面的博客我们提到了数据结构中的数组和数组队列,数组访问速度快但是有存储类型和存储个数的限制

数组队列虽然解决了上面两个问题,但是在指定位置增删元素不方便,需要移动大部分元素

为了适应某些特定场景的需求,我们可以使用链表这一在内存中非线性存储的数据结构

链表的实现其实并没有想象的复杂,具体关系如上图

单向链表的实现

首先我们需要定义一个节点类,需要有数据域和指针域构成,定义一个带Object参数的构造方法和无参的构造方法,分别用来创建存储数据的节点和空节点。

public class Node {
	
	private Object data;//节点的数据域
	private Node next;//节点的指针域
	
	public Node(){
		this.data=null;
	}
	public Node(Object data){
		this.data=data;//根据数据来创建节点
	}
}

然后只需要在节点类中设置两个属性的set和get方法即可。

属性:

然后我们新建我们需要的链表类,为了方便我们实现链表需要的各种方法,我们在链表中定义初始节点,尾节点和size属性

public class Linked {
	private Node root;// 声明链表中的初始空节点
	private Node last;// 声明链表中的尾节点
	private int size;// 存储链表中数据的个数
}

构造方法:

实现链表有两种方法,一种是直接将第一个节点作为头节点,一种是将第一个节点作为空节点指向头节点

这里我使用的是后者,两者在实现其他方法时会有细微的差别注意一下即可

public Linked() {
		root = new Node();
	}

访问链表的方法(以add方法举例):

add方法有两种实现的方法,一种是头插法,一种是尾插法。就是在添加数据时将新的数据放在链表的开始还是结束的位置

我在这里使用的是尾插法:

public void add(Object data) {
		Node node = new Node(data);// 根据数据创建节点
		// 添加到最后
		if (size == 0) {
			root.setNext(node);
			last = node;
			size++;
		} else {
			last.setNext(node);
			last = node;
			size++;
		}
		// //添加到第一个节点
		// node.setNext(root.getNext());
		// root.setNext(node);
		// size++;
	}

这样我们一个简单的单向链表就实现了,虽然还只能添加数据,不过最好自己尝试写一个get(int index)方法去测试一下

猜你喜欢

转载自blog.csdn.net/qq_41819698/article/details/82156854