数据结构,链表(一)

简介: 本文讲解:Java数据结构中的链表。

 image.gif编辑

链表的模拟实现

在模拟实现链表前,首先我们要搭建一个链表结构。也就是初始化出一个链表,如下程序:

public class LinkedList {
    /**
     * 内部类Node
     */
    static class Node {
        public int val;//存储数据
        public Node next;//存储下一个节点
        //构造方法
        public Node(int val) {
            this.val = val;
        }
    }
    public Node head;//当前链表头节点的引用
    /**
     * 初始化链表
     */
    public void init() {
        //通过构造方法初始化三个数据
        Node val1 = new Node(1);
        Node val2 = new Node(2);
        Node val3 = new Node(3);
        //形成一个链表
        val1.next = val2;
        val2.next = val3;
        head = val1;
    }
}

image.gif

以上程序,就实现了一个简易的链表,这个链表在内存中的布局大概如下图所示:

image.gif编辑


1.遍历链表

/**
     * 遍历链表
     */
    public void display(){
        Node node = head;
        while(node != null) {
            System.out.print(node.val+" ");
            node = node.next;
        }
        System.out.println();
    }

image.gif

遍历链表,我们只需要从头节点遍历到尾节点即可。注意node!=null代表遍历到最后一个节点的下一个节点。node.next!=null代表遍历到最后一个节点。

我们在Test类来进行测试:

public class Test {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.init();//初始化链表
        linkedList.display();//打印链表
    }
}

image.gif

运行后输出:

image.gif编辑 可以看到输出的就是我们初始化的三个元素。


2.获取链表大小

/**
     * 获取链表的大小
     *
     */
    public int size(){
        Node var = head;
        int count = 0;
        while(var!=null) {
            count++;
            var = var.next;
        }
        return count;
    }

image.gif

获取链表的大小, 也是非常的容易的。我们只需要使当前的节点变为下一个节点,知道当前的节点变为空即可。

image.gif编辑

Test类中测试:

public class Test {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.init();//初始化链表
        System.out.println(linkedList.size());//输出链表大小
    }
}

image.gif

运行后输出:

image.gif编辑


3.从头插入数据

/**
     * 头插法
     * @param data
     */
     public void addFirst(int data){
        Node node = new Node(data);
        node.next = head;
        head = node;
     }

image.gif

头插法,我们不考虑链表中是否有元素。因为从头开始插入,无论链表中是否有元素,始终是从头开始插入。

image.gif编辑

Test类测试:

public class Test {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.init();//初始化链表
        linkedList.addFirst(5);//在链表头头插一个5
        linkedList.display();//打印链表
    }
}

image.gif

运行后输出:

image.gif编辑


4.从尾部插入数据

/**
     * 尾插法
     * @param data
     */
     public void addLast(int data){
         Node node = new Node(data);
         Node cur = head;
         if (head == null) {
             head = node;
             return;
         }
         while (cur.next !=null) {
             cur = cur.next;
         }
         cur.next = node;
     }

image.gif

从尾部插入,也就是在链表的最后位置插入一个数据,也是非常的简单。但是与头插不同,尾插我们要考虑链表为空的情况,如果链表为空则直接使头节点head等于date的引用并且return结束程序。

image.gif编辑

Test类中测试:

public class Test {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.init();//初始化链表
        linkedList.addLast(9);//在链表尾部插入一个9
        linkedList.display();//打印链表
    }
}

image.gif

运行后输出:

image.gif编辑

相关文章
|
1月前
|
缓存
数据结构之 - 链表数据结构详解: 从基础到实现
数据结构之 - 链表数据结构详解: 从基础到实现
77 6
|
24天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
50 4
|
25天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
25天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
26 7
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
25 3
|
1月前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
17 0
数据结构与算法学习五:双链表的增、删、改、查
|
24天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
40 0
【数据结构】——双向链表详细理解和实现
【数据结构】——双向链表详细理解和实现
|
1月前
|
存储 Java
【数据结构】链表
【数据结构】链表
18 1