【Java数据结构】傻瓜都懂的双向链表,你值得阅读(附详细图解和源代码)

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

image

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

🎈寻找插入点

🎈插入元素

✨删除元素

🎈清空链表

🎈全部代码

✨TestDemo✨

✨MylLinkList✨


🍔写在前面

==========

双向链表是链表的最后的重要内容,学习双向链表要结合单向链表来实现,如果你认为本篇博客写的不错的话,求点赞,求收藏,求评论,你的三连是我进步最大的动力,废话不多说,让我们学起来吧!!!

🍔温馨提醒

==========

学习双链表前可以复习之前的我的单向链表

【Java数据结构-线性表】两万字硬核详细总结,附详细图解源代码,你值得收藏

🍔双向链表

======

🎈链表的实现


public class DoubleLinkedList {

//头插法

public void addFirst(int data){

}

//尾插法

public void addLast(int data){

}

//任意位置插入,第一个数据节点为0号下标

public boolean addIndex(int index,int data){

}

//查找是否包含关键字key是否在单链表当中

public boolean contains(int key){

}

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

public void remove(int key){

}

//删除所有值为key的节点

public void removeAllKey(int key){

}

//得到单链表的长度

public int size(){

}

public void display(){

}

public void clear(){

}

}

🎈构造节点与链表


public static void main(String[] args) {

MyLinkedList myLinkedList = new MyLinkedList();

}

public ListNode head;//指向双向链表的头节点

//public ListNode head = new ListNode(-1);//指向双向链表的头节点

public ListNode last;//指向的是尾巴节点

🎈打印链表


public void display() {

//和单链表的打印方式是一样的

ListNode cur = this.head;

while (cur != null) {

System.out.print(cur.val+" ");

cur = cur.next;

}

System.out.println();

}

🎈求链表长度


/得到单链表的长度

public int size() {

int count = 0;

ListNode cur = this.head;

while (cur != null) {

count++;

cur = cur.next;

}

return count;

}

🎈查找是否包含关键字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 void addFirst(int data) {

ListNode node = new ListNode(data);

if(this.head == null) {

this.head = node;

this.last = node;

}else {

node.next = this.head;

this.head.prev = node;

this.head = node;

}

}

public static void main(String[] args) {

MyLinkedList myLinkedList = new MyLinkedList();

myLinkedList.addFirst(12);

myLinkedList.addFirst(23);

myLinkedList.addFirst(34);

myLinkedList.addFirst(45);

myLinkedList.addFirst(56);

myLinkedList.display();

}

🎈尾插法


//尾插法

public void addLast(int data){

ListNode node = new ListNode(data);

if(this.head == null) {

this.head = node;

this.last = node;

}else {

this.last.next = node;

node.prev = this.last;

this.last = node;

}

}

public static void main(String[] args) {

MyLinkedList myLinkedList = new MyLinkedList();

myLinkedList.addLast(12);

myLinkedList.addLast(23);

myLinkedList.addLast(34);

myLinkedList.addLast(45);

myLinkedList.addLast(56);

myLinkedList.display();

}

🎈寻找插入点


public ListNode searchIndex (int index) {

ListNode cur = this.head;

while (index != 0) {

cur = cur.next;

index–;

}

return cur;

}

🎈插入元素


//任意位置插入,第一个数据节点为0号下标

public void addIndex(int index,int data){

ListNode node = new ListNode(data);

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

System.out.println(“index位置不合法!”);

return;

}

if(index == 0) {

addFirst(data);

return;

}

if(index == size()) {

addLast(data);

return;

}

ListNode cur = searchIndex(index);

node.next = cur.prev.next;

cur.prev.next = node;

node.prev = cur.prev;

cur.prev = node;

}

public static void main(String[] args) {

MyLinkedList myLinkedList = new MyLinkedList();

myLinkedList.addLast(12);

myLinkedList.addLast(23);

myLinkedList.addLast(34);

myLinkedList.addLast(45);

myLinkedList.addLast(56);

myLinkedList.display();

myLinkedList.addIndex(3,99);

myLinkedList.display();

}

✨删除元素


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

public void remove(int key){

ListNode cur = this.head;

while (cur != null) {

if(cur.val == key) {

if(cur == head) {

head = head.next;

if(head != null) {

head.prev = null;

}else {

last = null;

}

}else {

cur.prev.next = cur.next;

if(cur.next != null) {

//中间位置

cur.next.prev = cur.prev;

}else {

last = last.prev;

}

}

return;

}

cur = cur.next;

}

}

public static void main(String[] args) {

MyLinkedList myLinkedList = new MyLinkedList();

myLinkedList.addLast(12);

myLinkedList.addLast(23);

myLinkedList.addLast(34);

myLinkedList.addLast(45);

myLinkedList.addLast(56);

myLinkedList.display();

myLinkedList.remove(23);

结局:总结+分享

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱

  • Java互联网工程师面试1000题

image.png

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

image.png

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

image.png

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

image.png

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

img-Y1mqFgLg-1715479064997)]

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

[外链图片转存中…(img-EaE3X63V-1715479064997)]

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

[外链图片转存中…(img-WCABz5ns-1715479064997)]

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

[外链图片转存中…(img-777SCVQp-1715479064998)]

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值