当前位置:   article > 正文

java - 数据结构,双向链表 - LinkedList_java双向链表数据结构

java双向链表数据结构

一、双向链表 (不带头)

无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表
在这里插入图片描述

  • 双向链表 和 单向链表的区别,就在于 双向 比 单向 多个 一个前驱地址。而且 你会发现 正因为有了前驱地址,所以所以这个链表,它有两种走向,这也是这个链表为什么叫做双向链表的原因之一

首先看看单链表是如何删除节点的

在这里插入图片描述
总结:
   单向链表在删除一个节点的时候,需要借助前驱节点,才能删除。

双向链表是如何删除节点的

双向链表删除节点,不需要借助前驱节点
因为双向链表,它存储前驱和后驱的节点的地址,它都知道。
另外双向链表会多一个引用last,这个引用永远指向此时链表的尾巴节点
head就是永远指向双向链表的头节点。

在这里插入图片描述

二、模拟实现双向链表

2.1、实现一个类,来表示双向链表的节点

class ListNode{
   
    //存储int类型的数据
    public int val;
    //存储上一个节点的地址
    public ListNode prev;
    //存储下一个节点的地址
    public ListNode next;
    
    public ListNode(int val){
   
        //构造方法
        this.val = val;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.2、实现一个类,来表示双向链表

public class MyLinkedList {
   
    //指向双向链表的头结点
    public ListNode head;
    //指向双向链表的尾巴节点
    public ListNode last;

    //头插法
    public void addFirst(int data){
   
        
    };
    //尾插法
    public void addLast(int data){
   
        
    };
    //任意位置插入,第一个数据节点为0号下标
    public boolean addIndex(int index,int data){
   
        return true;
    };
    //查找是否包含关键字key是否在单链表当中
    public boolean contains(int key){
   
        return true;
    };
    //删除第一次出现关键字为key的节点
    public void remove(int key){
   
        
    };
    //删除所有值为key的节点
    public void removeAllKey(int key){
   
        
    };
    //得到单链表的长度
    public int size(){
   
        return 0;
    };
    public void display(){
   
        
    };
    public void clear(){
   
        
    };
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

实现LinkedList中的所有方法
通过这些方法就可以操作链表

打印链表

//打印链表
    public void display(){
   
        ListNode cur = this.head;
        while(cur != null){
   
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
        System.out.println();
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

得到链表的长度

//得到链表的长度
    public int size(){
   
        ListNode cur = this.head;
        int count = 0;
        while(cur != null){
   
            count++;
            cur = cur.next;
        }
       return count;
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

//查找是否包含关键字key是否在单链表当中
//找到返回true,找不到返回false
    public boolean contains(int key){
   
        ListNode cur = this.head;
        while (cur != null){
   
            if(cur.val == key){
   
                return true;
            }
            cur = cur.next;
        }
        return false;
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

头插法

//头插法
    public void addFirst(int data){
   
        ListNode node = new<
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/935484
推荐阅读
相关标签
  

闽ICP备14008679号