🏀 链表的介绍
??????链表是有序的列表,有如下特点: (1)链表是以节点的方式存储,为链式存储; (2)每个节点包含data域,next域:指向下一个节点; (3)如下图所示:链表的各个节点不一定是连续存储的; (4)链表分带头节点和没有头节点的,根据实际需求确定。
??????链表它在内存中是存储如下:链表的物理结构示意图👇👇👇
??????链表在我们想象概念中的样子是怎样的呢?如下是链表的逻辑结构示意图👇👇👇在我们编码时就把它想象成这样是最好的,不要把自己也给绕进去了~~~
🏀 单链表的添加
???单链表的添加有两种方法,如下所示:👇👇👇 ???💥① 不考虑编码的顺序(方法一)也可以称之为尾插法 1.先创建一个head头节点,作用就是表示单链表的头; 2.后面我们每添加一个节点,就直接加入到链表的最后。 ???方法一添加示意图如下所示👇👇👇
???💥② 需要按照编号的顺序添加(方法二) ???第二种方法就在内存中就实现了数据的添加操作,比在数据库中进行操作时要快很多,效率高!!!(推荐使用呀!)👍👍👍 1.首先找到新添加的节点的位置,是通过辅助变量(指针)temp,通过遍历实现; 2.新的节点.next = temp.next; 3.将temp.next = 新的节点。 ???方法二添加示意图如下所示👇👇👇
🏀 单链表的遍历
????💥单链表的遍历过程相比较而言是最简单的一个过程,一个步骤就可以搞定 1.通过一个辅助变量(指针),帮助遍历整个单链表即可完成查询过程。
🏀 单链表的修改
????💥单链表的修改核心思想就是找到节点并替换除编号外的其他属性值 1.根据编号no来确认节点修改的位置,借助辅助变量(指针)temp,通过遍历实现 2. temp.name == 修改节点.name,temp.job ==修改节点.job ???单链表修改示意图如下所示👇👇👇
🏀 单链表的删除
????💥单链表的删除思想:找到被删除的节点后借助temp临时变量(指针)指向下下个节点 1.先找到需要删除的这个节点的前一个节点temp 2.temp.next = temp.next.next 3.被删除的节点将不会有其它引用指向,会被垃圾回收机制回收 ???单链表删除示意图如下所示👇👇👇
🏀 具体代码实现
????💥以下是对上述增删查改思想的代码实现,功能都已完成,大家可以在对相关操作思考后再写代码的效率会高很多哦,不然也比较烧脑袋,有些地方我也花了不少时间去琢磨🙌🙌🙌
package com.java.linkedlist;
public class SingleLinkedListDemo {
public static void main(String[] args) {
PersonNode personNode1 = new PersonNode(1, "鸣人", "七代火影");
PersonNode personNode2 = new PersonNode(2, "卡卡西", "六代火影");
PersonNode personNode3 = new PersonNode(3, "纲手", "五代火影");
PersonNode personNode4 = new PersonNode(4, "水门", "四代火影");
PersonNode personNode5 = new PersonNode(5, "佐助", "上忍");
PersonNode personNode6 = new PersonNode(6, "宁次", "上忍");
PersonNode personNode7 = new PersonNode(7, "小樱", "上忍");
PersonNode personNode8 = new PersonNode(8, "雏田", "上忍");
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addNode(personNode1);
singleLinkedList.addNode(personNode3);
singleLinkedList.addNode(personNode2);
singleLinkedList.addNode(personNode4);
System.out.println("方法一的添加方式:");
singleLinkedList.showNode();
singleLinkedList.addNodeByOrder(personNode5);
singleLinkedList.addNodeByOrder(personNode6);
singleLinkedList.addNodeByOrder(personNode8);
singleLinkedList.addNodeByOrder(personNode7);
System.out.println("方法二的添加方式:");
singleLinkedList.showNode();
System.out.println("节点修改后的信息为:");
PersonNode newPersonNode = new PersonNode(8, "田妹", "鸣人老婆");
singleLinkedList.editNode(newPersonNode);
singleLinkedList.showNode();
System.out.println("节点删除后的信息为:");
singleLinkedList.deleteNode(7);
singleLinkedList.showNode();
singleLinkedList.deleteNode(7);
System.out.println();
System.out.print("有效节点数为:"+getNodeLength(singleLinkedList.getHead()));
}
public static int getNodeLength(PersonNode personNode){
if (personNode.next == null){
System.out.println("链表为空,无有效节点");
return 0;
}
int length = 0;
PersonNode temp = personNode.next;
while (temp != null){
length++;
temp = temp.next;
}
return length;
}
}
class SingleLinkedList {
private PersonNode head = new PersonNode(0,"","");
public PersonNode getHead() {
return head;
}
public void addNode(PersonNode personNode){
PersonNode temp = head;
while (true) {
if (temp.next == null){
break;
}
temp = temp.next;
}
temp.next = personNode;
}
public void addNodeByOrder(PersonNode personNode){
PersonNode temp = head;
boolean tag = false;
while (true) {
if (temp.next == null){
break;
}
if (temp.next.no > personNode.no){
break;
}else if (temp.next.no == personNode.no){
tag = true;
break;
}
temp = temp.next;
}
if (tag){
System.out.println("准备插入的人物的编号:"+personNode.no+"已经存在,不能多次添加");
}else {
personNode.next = temp.next;
temp.next = personNode;
}
}
public void showNode(){
if (head.next == null){
System.out.println("链表为空");
return;
}
PersonNode temp = head.next;
while (true) {
if (temp == null){
break;
}
System.out.println(temp);
temp = temp.next;
}
}
public void editNode(PersonNode personNode){
if (head.next == null){
System.out.println("链表为空");
return;
}
PersonNode temp = head.next;
boolean tag = false;
while (true) {
if (temp == null){
break;
}
if (temp.no == personNode.no){
tag = true;
break;
}
temp = temp.next;
}
if (tag) {
temp.name = personNode.name;
temp.job = personNode.job;
}else {
System.out.println("没有找到编号:"+personNode.no+"的节点,不能修改");
}
}
public void deleteNode(int no){
PersonNode temp = head;
boolean tag = false;
while (true) {
if (temp.next == null){
System.out.println("遍历结束,已经到单链表的最后了");
break;
}
if (temp.next.no == no){
tag = true;
break;
}
temp = temp.next;
}
if (tag){
temp.next = temp.next.next;
}else {
System.out.println("要删除编号为"+no+"的节点不存在");
}
}
}
class PersonNode {
public int no;
public String name;
public String job;
public PersonNode next;
public PersonNode(int no, String name, String job){
this.no = no;
this.name = name;
this.job = job;
}
@Override
public String toString() {
return "PersonNode{" +
"no=" + no +
", name='" + name + '\'' +
", job='" + job + '\'' +
'}';
}
}
????以上便是对单链表基础的增删查改的全部分析和实现过程,单链表还有更多复杂的需求分析,还有更多优化的过程,值得大家去学习积累,毕竟学好链表打好基础对之后的底层代码理解帮助很大哦!!!💬💬💬下篇博文将更新双向链表等知识的梳理。 ????路过的小伙伴,如果博文有帮助到你解决问题,可以点赞+收藏+关注一波呀~👊👊👊本人将会持续更新相关数据结构与算法Java实现版本学习的博文,感谢您的支持哦!!!芜湖起飞??????
|