一、首先说一下线性表
1. 什么是线性表,线性表的逻辑特性?
1)有一个头(表头),有一个尾(表尾)
2)表头与表尾之间的元素有且只有一个前驱元素,有且只有一个后继元素
2.线性表有两种存储方式?
顺序表和链表
3.顺序表和链表的区别?
1)顺序表是一边连续的存储空间
链表是一片散列的存储空间
2)顺序表只要知道表头就可以快速查询到其他任何位置的元素。
因为顺序表是连续排列的,比如我们知道了1号元素的位置,要想查6号元素的位置,只需将1号元素的位置加5个距离就能立刻知道6号元素的位置。而链表则不行,在链表中,想要知道某个元素的位置,必须通过该元素的上一个元素的指针去查。
3)链表利于数据的插入和删除操作,而顺序表则不利于插入和删除操作。
在顺序表中我们若删除一个元素,则需将该元素后面的所有元依此前移一位,而链表只需将插入位置的前一位元素的指针指向自己,将自己的指针指向插入位置的后一位元素即可。
4)因为链表中会有一部分空间用来存储指针,所以空间利用率会比顺序表稍差一些。
二、用java实现简单的链表(单链表的插入,删除操作)
1.首先,链表中的节点是一个单独的对象,我们因该将其抽离出来。
一个节点包括两个属性:数据(用于存放数据),和指针(指向下一个节点),所以创建节点类如下:
package myStudy.dataStructure.day2;
/**
*
* @description 节点类
* @author shenrenfeng
* @date 2018年11月4日 上午11:14:07
*
*/
public class Node {
private int data;// 节点数据
private Node next;// 节点指针,指向下一个节点
public Node(int data) {
this.data = data;
this.next = null;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
2、创建单链表类
单链表至少包括一个属性:头节点
package myStudy.dataStructure.day2;
/**
*
* @description 单链表
* @author shenrenfeng
* @date 2018年11月4日 上午11:16:23
*
*/
public class SinglyLinkedList {
private Node firstNode;// 头节点
/**
* 插入节点(在头节点之后插入)
* @param data
*/
public void insert(int data) {
Node node = new Node(data);
if(firstNode == null) {
firstNode = node;
} else {
node.setNext(firstNode.getNext());
firstNode.setNext(node);
}
}
/**
* 删除节点(删除头节点)
* @return 返回被删除的头节点
*/
public Node delete() {
Node deletedNode = firstNode;
firstNode = firstNode.getNext();
return deletedNode;
}
/**
* 展示链表数据
*/
public void showList() {
Node currentNode = firstNode;
while(currentNode != null) {
System.out.print(currentNode.getData());
System.out.print(" ");
currentNode = currentNode.getNext();
}
}
public Node getFirstNode() {
return firstNode;
}
public void setFirstNode(Node firstNode) {
this.firstNode = firstNode;
}
}
3、进行测试
package myStudy.dataStructure.day2;
/**
*
* @description 测试单链表
* @author shenrenfeng
* @date 2018年11月4日 上午11:39:50
*
*/
public class Test {
public static void main(String[] args) {
SinglyLinkedList list = new SinglyLinkedList();
list.insert(9);
list.insert(2);
list.insert(4);
list.insert(8);
list.insert(5);
list.showList();
System.out.println();
list.delete();
list.delete();
list.delete();
list.showList();
}
}
测试结果:
结果说明:
因为一个插入的作为头节点,所以9在最前面,而后面每次是从头节点之后插入的,类似倒序,所以插入顺序虽然为9 2 4 5 8 输出结果却为9 5 8 4 2
删除是直接将头节点删除