链表 学习笔记
一、链表(Linked List) 介绍
二、链表 分类
(一)单链表
1、思路分析:
添加——无序
- 定义头结点,
- 编写添加操作——在链表末尾添加结点
- 遍历集合
添加——按照顺序插入
删除
2、代码实现——增删改查
HeroNode (节点类)
package com.example.demotest.linkedList.single;
import lombok.Data;
/**
* 定义结点HeroNode ,每个HeroNode 对象就是一个节点
*
* @author wanglin
* @version 1.0
* @date 2022-03-03 周四
*/
@Data
public class HeroNode {
public int no;
public String name;
public String nickName;
/**
* 指向下一个节点
*/
public HeroNode next;
public HeroNode(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
SingleLinkedList (链表类 )
package com.example.demotest.linkedList.single;
/**
* 定义SingleLinkedList 管理我们的英雄
*
* @author wanglin
* @version 1.0
* @date 2022-03-03 周四
*/
public class SingleLinkedList {
/**
* 先初始化我们的头节点,头节点不要动,不存放具体的数据
*/
private HeroNode head = new HeroNode(0, "", "");
/**
* 添加节点到单向链表
* 思路:当不考虑顺序时
* 1. 找到当前链表的最后节点
* 2. 将最后这个节点的next 指向 新的节点
*
* @param heroNode
*/
public void add(HeroNode heroNode) {
//因为head 节点不能动,因此我们要定义一个辅助变量来遍历
HeroNode temp = head;
//遍历链表,找到最后
while (true) {
//找到链表的最后
if (temp.next == null) {
break;
}
//如果没有找到最后,将temp 后移
temp = temp.next;
}
//当退出while 循环时,temp 就指向到了最后
//将最后这个节点的next 指向新的节点
temp.next = heroNode;
}
/**
* 显示链表【遍历】
*/
public void list() {
//判断链表是否为空
if (head.next == null) {
System.out.println("链表为空!");
return;
}
//因为头结点不能动,因此我们需要一个辅助变量来遍历
HeroNode temp = head.next;
while (true) {
//判断是否到链表最后
if (temp == null) {
break;
}
System.out.println(temp);
//将temp 后移,否则死循环
temp = temp.next;
}
}
public void addByOrder(HeroNode heroNode) {
HeroNode temp = head;
Boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no > heroNode.no) { // 位置找到了,就是在temp 的后面
break;
} else if (temp.next.no == heroNode.no) { //说明编号存在
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("准备插入的英雄已存在,不能加入!");
} else {
//插入到链表中
heroNode.next = temp.next;
temp.next = heroNode;
}
}
/**
* 根据no 来修改,即no 不变
*
* @param heroNode
*/
public void update(HeroNode heroNode) {
//链表是否为空
if (head.next == null) {
System.out.println("链表为空!");
}
HeroNode temp = head;
Boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.no == heroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
//根据no,修改信息
temp.name = heroNode.name;
temp.nickName = heroNode.nickName;
} else {
//没有找到哦
System.out.println("没有找到编号:" + heroNode.no + " 的节点,不能修改!");
}
}
/**
* 删除
* 让 temp 找到删除节点的前一个节点
*/
public void remove(int no) {
HeroNode temp = head;
Boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else {
System.out.println("删除的节点:" + no + "不存在!");
}
}
}
SingleLinkedListDemo (测试类)
(二)双向链表
关注林哥,持续更新哦!!!★,°:.☆( ̄▽ ̄)/$:.°★ 。