目录
链表的概念
链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。
这次要实现的是单向,不带头,非循环的链表,形式如下图所示,就像是一个火车头拉着一节节火车。
单向和不循环相对来说好理解一些,关于这个不带头可能有点难理解,下面这张图是带头,两图对比着看好理解一些
链表的实现
链表的功能
链表的功能包括插入数据、删除数据、查找数据以及销毁链表等功能,其中的部分功能还有细分。
框架搭建
首先我们可以创建一个MySingleList类,在其中定义链表的基本内容,这要运用到了静态代码块方面的知识。
MySingleList类
public class MySingleList implements IList{
static class ListNode{
public int val;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
}
public ListNode head;
}
之所以定义 head,是要把它作为链表的第一个结点,链表中每一个如下的部分都可称为一个结点。
创建一个IList接口类,再通过MySingleList类来重写接口的方法。
IList接口
public interface IList {
//头插法
public void addFirst(int data);
//尾插法
public void addLast(int data);
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data);
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key);
//删除第一次出现关键字为key的节点
public void remove(int key);
//删除所有值为key的节点
public void removeAllKey(int key);
//得到单链表的长度
public int size();
public void clear();
public void display();
public void createList();
}
此时的MySingleList类为
public class MySingleList implements IList{
static class ListNode{
public int val;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
}
public ListNode head;
@Override
public void addFirst(int data) {
}
@Override
public void addLast(int data) {
}
@Override
public void addIndex(int index, int data) {
}
@Override
public boolean contains(int key) {
return false;
}
@Override
public void remove(int key) {
}
@Override
public void removeAllKey(int key) {
}
@Override
public int size() {
return 0;
}
@Override
public void clear() {
}
@Override
public void display() {
}
@Override
public void createList() {
}
}
功能实现
打印链表
display方法
在打印链表之前,需要有链表才能打印,所以我们要先创建一个链表,写一个createList方法来实现
createList方法
public void createList(){
ListNode node1 = new ListNode(12);
ListNode node2 = new ListNode(23);
ListNode node3 = new ListNode(34);
ListNode node4 = new ListNode(45);
ListNode node5 = new ListNode(56