手写单向链表
定义:
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针。
单向链表示意图:
单向链表的特点:
优点:
1 链表结构在物理空间中不需要连续的,逻辑上连续的一种结构。
2 单个结点创建非常方便,不需要开辟连续的物理空间,只需要有单个结点的空间就可以创建链表,之后再添加新元素时可以使用任何位置的空间,可以使用与现在元素的位置不相连接的空间。
3 插入或删除的效率较数组更好,不需要重新移动现在数据。
缺点:
查询的效率较数组差。必须依次按钮链表的顺序进行查询,直到查询到指定的元素为止。
手写单向链表
创建节点类
class HeroNode {
int no;
String name;
String nickName;
HeroNode next;
private static HeroNode instance;
public HeroNode() {
}
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
public static HeroNode getInstance() {
if (instance == null){
synchronized (HeroNode.class){
if (instance == null){
instance = new HeroNode(0, "", "");
}
}
}
return instance;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
创建链表类
class SingleLinkedList {
public SingleLinkedList() {
head = HeroNode.getInstance();
}
private HeroNode head;
/**
* 展示列表
*/
public void showList() {
if (head.next == null) {
System.out.println("链表为空~~~");
return;
}
HeroNode temp = head.next;
while (true) {
System.out.println(temp);
if (temp.next == null) {
break;
}
temp = temp.next;
}
}
/**
* 在链表尾部添加元素
*
* @param node
*/
public void add(HeroNode node) {
HeroNode temp = head;
while (true) {
if (temp.next == null) {
temp.next = node;
break;
}
temp = temp.next;
}
}
/**
* 根据英雄编号有序插入相应位置
*
* @param node
*/
public void insert(HeroNode node) {
if (head.next == null) {
head.next = node;
return;
}
HeroNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
flag = true;
break;
}
if (node.no == temp.next.no) {
break;
}
if (temp.next.no > node.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
node.next = temp.next;
temp.next = node;
} else {
System.out.println("当前英雄编号已存在,不能插入");
}
}
/**
* 根据编号删除对应编号的英雄
*
* @param no 英雄编号
*/
public void delete(int no) {
if (head.next == null) {
System.out.printf("链表不存在对应编号为 %d 的英雄", no);
return;
}
boolean flag = false;
HeroNode temp = this.head;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == no) {
flag = true;
temp.next = temp.next.next;
break;
}
temp = temp.next;
}
if (flag) {
System.out.printf("删除编号为 %d 的英雄\n", no);
} else {
System.out.println("链表不存在对应编号的英雄");
}
}
}
测试:
1 在尾部添加元素:
public static void main(String[] args) {
SingleLinkedList list = new SingleLinkedList();
HeroNode hero1 = new HeroNode(1, "宋江", "及时雨")