3 单链表
1) 链表介绍(Linked List)
- 链表是以节点的方式来存储
- 每个节点包含data域,next域(表示指向的下一个节点地址)
- 如下图:发现链表的各个节点不一定是连续存储
- 链表分为带头节点的链表和没有头节点的链表,根据实际需求确定
如图:
1. 单链表的实际存储结构
2. 单链表的逻辑存储模型
3) 单链表的创建
1.方法一:直接添加在尾部
-
先创建一个head头节点,作用表示单链表的头
-
后面每添加一个节点,就直接加入到链表的最后
-
遍历:
通过一个辅助遍历,帮助遍历整个链表
2.方法二:根据(英雄)的排名插入
-
首先找到新添加的节点的位置(通过辅助变量)->通过遍历找到
-
新的节点的.next = temp.next
-
将temp.next = 新的节点
Ps
其实就两步走,第一步,将新节点的next变成temp.next;第二步,将temp.next指向新的节点,而不是原本的节点,因为原本temp.next的节点由新节点指向了
代码实现——链表的增删改查
package DataStructures.SingleLinkedList;
import javafx.scene.shape.StrokeLineCap;
import java.util.Stack;
import java.util.function.DoubleToIntFunction;
public class SingleLinkedListDemo {
public static void main(String[] args) {
// 进行测试
//先创建节点
HeroNode hero1 =new HeroNode(1,"宋江","及时雨");
HeroNode hero2 =new HeroNode(2,"卢俊义","玉麒麟");
HeroNode hero3 =new HeroNode(3,"吴用","智多星");
HeroNode hero4 =new HeroNode(4,"林冲","豹子头");
//创建链表
SingleLinkedList singleLinkedList = new SingleLinkedList();
//直接在队尾添加
// singleLinkedList.add(hero1);
// singleLinkedList.add(hero2);
// singleLinkedList.add(hero3);
// singleLinkedList.add(hero4);
//按照编号顺序添加
singleLinkedList.addByOrder(hero1);
singleLinkedList.addByOrder(hero4);
singleLinkedList.addByOrder(hero2);
singleLinkedList.addByOrder(hero3);
//修改前
System.out.println("修改前的链表情况~~");
singleLinkedList.list();
//修改节点的代码
HeroNode newHeroNode =new HeroNode(2,"小卢","玉麒麟~~");
singleLinkedList.update(newHeroNode);
//修改后
System.out.println("修改后的链表情况~~");
singleLinkedList.list();
//查找目标节点
singleLinkedList.find(2);
//删除前
System.out.println("删除前的链表情况~~");
singleLinkedList.list();
// 删除一个节点
singleLinkedList.del(3);
//删除后
System.out.println("修改后的链表情况~~");
singleLinkedList.list();
//测试一下单链表中的有效节点的个数
System.out.println("有效的节点个数:"+ gerLength(singleLinkedList.getHead()));
//测试一下 看看是否得到倒数第K个节点
HeroNode res = findLastIndexNode(singleLinkedList.getHead(),4);
System.out.println("res="+res);
//测试一下单链表的反转功能
System.out.println("原来链表的情况~~");
singleLinkedList.list();
// System.out.println("反转后单链表~~");
// reversetList(singleLinkedList.getHead());
// singleLinkedList.list();
System.out.println("测试逆序打印单链表~~");//没有改变链表的原结构变化
reversePrint(singleLinkedList.getHead());
}
// 逆序打印【百度面试题】
//思路:
//方式一:先将链表反转,然后遍历——>缺点是会破坏单链表的结构,不建议
//方式二: 利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果
//Ps:演示栈的应用转——》TestStack
//使用方式二来实现逆序打印
public static void reversePrint(