线性表:零个或多个数据元素的有限序列
首先他是一个序列,也就是说元素之间是有顺序的,若元素存在多个,则第一个无前驱,最后一个元素无后驱,其他元素都有一个前驱后驱,同时元素也是有限的。
如图
先从最简单的开始吧
1、单链表
单向链表只可向一个方向遍历,一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。
- 插入一个节点,对于单向链表,我们只提供在链表头插入,只需要将当前插入的节点设置为头节点,next指向原头节点即可。
- 删除一个节点,我们将该节点的上一个节点的next指向该节点的下一个节点。
1.1、数据结构:
private int size;//链表节点的个数
private Node head;//头节点
//节点数据结构
private class Node{
private Object data;//每个节点的数据
private Node next;//每个节点指向下一个节点的连接
public Node(Object data){
this.data = data;
}
}
1.2、链表头添加元素:
public Object addHead(Object obj){
Node newHead = new Node(obj);
if(size == 0){
head = newHead;
}else{
newHead.next = head;
head = newHead;
}
size++;
return obj;
}
主要是在添加的时候判断是否为空,就是当前链表是否没有元素,同时维持数量变量即可
1.3、链表头删除元素:
public Object deleteHead(){
Object obj = head.data
head=head.next;
size --;
return obj;
}
这里可以加个判断如果是size=0 直接return
删除头元素 也是直接把现在头元素下一位 赋值给 头元素就行了
1.4、查找指定元素
public Node find(Object obj){
Node current = head;
int tempSize = size;
while(tempSize > 0){
if(obj.equals(current.data)){
return current;
}else{
current = current.next;
}
tempSize--;
}
return null;
}
大家有兴趣可以继续写写其他的
- 遍历输出所有元素
- 删除制定元素
2、双向链表
对于单项链表,我们如果想在尾部添加一个节点,那么必须从头部一直遍历到尾部,找到尾节点,然后在尾节点后面插入一个节点。
这样操作很麻烦,如果我们在设计链表的时候多个对尾节点的引用,那么会简单很多
好 ,记住这个需求,然后我们实现
2.1、数据结构:
private Node head;//头节点
private Node tail;//尾节点
private int size;//节点的个数
private class Node{
private Object data;
private Node next;
public Node(Object data){
this.data = data;
}
}
2.2、添加节点:
public void addHead(Object data){
Node node = new Node(data);
if(size == 0){//如果链表为空,那么头节点和尾节点都是该新增节点
head = node;
tail = node;
size++;
}else{
node.next = head;
head = node;
size++;
}
}
维护好头节点元素和size
如果是尾节点添加元素怎么办呢
首先明白一点,如果是空链表,添加第一个元素,那它即是头,也是尾
这点很好理解吧
那如果我想在尾部添加元素呢,尾部元素下一位就是它,而它就是新的尾元素了,这点很好理解吧
public void addTail(Object data){
Node node = new Node(data);
if(size == 0){//如果链表为空,那么头节点和尾节点都是该新增节点
head = node;
tail = node;
size++;
}else{
tail.next = node;
tail = node;
size++;
}
}
好了 问题来了 怎么用双向列表实现队列
其实很简单,简单实现入列和出列吧
public void insert(Object data){
dp.addTail(data);
}
public void delete(){
dp.deleteHead();
}