Sequential And Linked Lists - 顺序表 和 链表 - 单向链表部分 - java(图文并茂,你值得一看)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!


遍历链表数据

=====================================================================

首先,我要区分清楚,链表 不是顺序表,不是一块连续的空间。 链表的每个元素 是由地址来连接起来的。

也就是说 我们不能使用普通思维模式 去思考 遍历链表的数据域的值

既然 链表是靠地址联系起来的,也就是说 靠 next域中 存储的地址来联系个节点的数据

这就是我们突破点。

利用 head 遍历每个每个节点的数据 写法 head = head/next,你可以参考上面的图,来细品。

这样我们就跳转到下一个节点,算了我还是画个图,请看下图(注意我埋了一个坑,你们等会就知道,只有被打过,才会知道疼)

在这里插入图片描述


揭秘坑


在这里插入图片描述


解决方法 (创建一个head的替身 【cur == current — 目前的】,来代替head去遍历链表数据)

代码如下:

在这里插入图片描述


调用者程序

在这里插入图片描述

效果图

在这里插入图片描述

另外注意一点

在这里插入图片描述


效果图

在这里插入图片描述


总结:


遍历链表的时候, 尤其是我们现在所讲的 不带头的链表,一定注意,不要让 头引用丢失,创建一个替身变量,让它去做。

保证头引用指向的永远都是 头节点,


链表要实现的功能

=======================================================================

在这里插入图片描述


查找关键字key是否在链表当中


public boolean contains(int key){

ListNode cur = this.head;

while(cur!=null){

if(cur.val==key){

return true;

}

cur = cur.next;

}

return false;

}

附图

在这里插入图片描述


效果图(最好两边加中间,还有找不到的情况都要测试一下)

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


 

得到单链表的长度


public int size(){

int count=0;

ListNode cur = this.head;

while(cur!=null){

count++;

cur=cur.next;

}

return count;

}

附图

在这里插入图片描述


头插法


public void addFirst(int data){

ListNode node = new ListNode(data);

node.next = this.head;

this.head = node;

}

附图

在这里插入图片描述


效果图

在这里插入图片描述


使用头插法,创建链表


在这里插入图片描述


尾插法


public void addLast(int data){

ListNode node = new ListNode(data);

if(this.head == null){

this.head = node;

}else{

ListNode cur = this.head;

while(cur.next!=null){

cur = cur.next;

}

cur.next = node;

}

}

附图

在这里插入图片描述*****

效果图

在这里插入图片描述


任意位置插入一个数据节点


public void addIndex(int index,int data){

if(index<0 || index>size()){

System.out.println(“插入数据节点的位置不合法”);

return;

}

if(index==0){

addFirst(data);// 调用头插

return;

}

if(index== size()){

addLast(data);

return;

}

ListNode cur = findIndex(index);// 接收 index-1位置节点的地址

ListNode node = new ListNode(data);// 根据 data的值,新建一个节点

// 插入节点程序

node.next = cur.next;

cur.next = node;

}

// 找到index-1位置的节点位置

// 跟图解解释的一样,如果你要插入一个位置,你就需要找它的前一个节点的位置

// 而我们是链表没有下标,所以返回是 前一个节点的地址

public ListNode findIndex(int index){

ListNode cur = this.head;

while(index-1 != 0){

cur = cur.next;

index–;

}

return cur;

}

附图

在这里插入图片描述


效果图

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


删除第一次出现关键字为key的节点


public void remove(int key){

if(this.head == null){// head为空

System.out.println(“链表为空,无数字可删除!”);

return;

}

if(this.head.val == key){// 判断头节点是为删除数字

this.head = this.head.next;

return;

}

ListNode cur = searchPrev(key);// 找到删除节点的前一个节点

if(cur == null){

System.out.println(“没有你要删除元素”);

return;

}

ListNode del = cur.next;// 要删除的节点地址

cur.next = del.next;// 删除节点

}

// 寻找删除节点的前一个节点(key的前驱)

public ListNode searchPrev(int key){

ListNode cur = this.head;

while(cur.next != null){

if(cur.next.val == key)

{

return cur;

}

cur = cur.next;

}

return null;// 表示没找到

}

附图

在这里插入图片描述


效果图

在这里插入图片描述


在这里插入图片描述


删除所有值为key的节点


public ListNode removeAllKey(int key){

if(this.head == null){

return null; // 防止后面的cur出现空指针错误

}

ListNode prev = this.head;

ListNode cur = this.head.next;

while(cur!=null){

if(cur.val == key){

prev.next = cur.next;

cur=cur.next;

}else{

prev = cur;

cur=cur.next;

}

}

// 最后处理头

if(this.head.val==key){

this.head = this.head.next;

}

return head;

}

附图

在这里插入图片描述


效果图

在这里插入图片描述


清除链表的所有的节点


public void clear(){

// this.head = null; 粗暴方法

// 温柔的(最稳的)

while(this.head!=null){

ListNode headNext = head.next;

this.head.next = null;

this.head = headNext;

}

}

附图

在这里插入图片描述


效果图

在这里插入图片描述


还有一种更直观的方法,请看连续图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

附上链表程序

=====================================================================

在这里插入图片描述

Java高频面试专题合集解析:

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

更多Java架构进阶资料展示

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
FFFF,t_70,g_se,x_16)

附上链表程序

=====================================================================

在这里插入图片描述

Java高频面试专题合集解析:

[外链图片转存中…(img-L1XJmNKh-1714744513112)]

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

[外链图片转存中…(img-ceqCRwGw-1714744513112)]

更多Java架构进阶资料展示

[外链图片转存中…(img-SEuhZO9b-1714744513113)]

[外链图片转存中…(img-nvSCJNdG-1714744513113)]

[外链图片转存中…(img-TQDPbrQe-1714744513113)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值