顺序表:物理上逻辑上都连续;
链表:物理上不一定连续,逻辑上一定连续的。
链表的概念及结构
概念:连表示一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是用过链表中的引用链接次序实现的。
8种链表结构:
单项、双向
带头、不带头
循环、非循环
主要的三种链表:
无头单项非循环链表、带头循环单链表、不带头双向循环链表
代码实现
1. 接口定义
package com.github.linked.Impl;
public interface ILinked {
// 头插法
void addFirst(int data);
// 尾插法
void addLast(int data);
// 任意位置插入,第一数据节点为0号下标
boolean addIndex(int index, int data);
// 查找是否包含关键字 key 在单链表中
boolean contains(int key);
// 删除第一次出现的关键字为 key 的节点
int remove(int key);
// 删除所有值为 key 的节点
void removeAllKey(int key);
// 得到单链表的长度
int getLength();
// 打印单链表
void display();
// 清空单链表以防内存泄漏
void clear();
}
2. 代码实现接口
package com.github.linked.Impl;
public class SingleListed implements ILinked {
// 节点类
class Node {
private int data;
private Node next;
public Node(int data) {
this.data = data;
this.next = next;
}
}
private Node head; //头节点
public SingleListed() {
this.head = head;
}
/**
* 头插法
* @param data 要插入的数据
*/
@Override
public void addFirst(int data) {
// 1. 拿到一个实体
Node node = new Node(data);
// 2. 插入
// 如果是第一次插入,直接到头节点
if (this.head == null) {
this.head = node;
} else {
//不是第一次插入
node.next = this.head; // 插入的节点指向头节点
this.head = node; // 更新头节点
}
}
/**
* 尾插法
* @param data 要插入的数据
*/
@Override
public void addLast(int data) {
// 1. 拿到一个实体
Node node = new Node(data);
Node cur = this.head;
// 2. 插入
// 如果是第一次插入,直接到头节点
if (this.head == n