Java算法进阶(一):链表


一、Java链表的含义

Java链表是一种基础的数据结构,它由一系列节点组成,每个节点都包含有数据和指向下一个节点的指针。这种数据结构可以用于实现各种算法和数据结构,如栈、队列、哈希表等。

二、Java链表的原理(深挖)

Java链表是一种常用的数据结构,可以用来存储一系列的数据,每个数据元素都是一个节点,节点中包含了两个部分:数据域指针域
数据域用来存储当前节点的数据,指针域用来指向下一个节点的位置。因此,Java链表是由一系列节点组成的,每个节点都有一个指向下一个节点的指针,最后一个节点的指针指向null,表示链表的末尾。
Java链表有单向链表、双向链表和循环链表等多种形式,其中单向链表是最简单的一种。单向链表中每个节点只有一个指向下一个节点的指针,双向链表中每个节点有两个指针,分别指向前一个节点和后一个节点,循环链表中最后一个节点的指针不是null,而是指向链表的头节点

三、Java链表的优缺点

1.优点

Java链表的优点在于插入和删除操作的时间复杂度为O(1),而数组的插入和删除操作会涉及到元素的移动,时间复杂度为O(n),因此链表在插入删除操作频繁的场景下更为适用。

2.缺点

Java链表的缺点在于访问某个节点的时间复杂度为O(n),而数组的访问时间复杂度为O(1),因此在需要频繁访问某个节点的场景下,数组更为适用。

四、Java链表示意图

在这里插入图片描述

五、Java链表的方法实现

Java链表的基本方法包括:插入节点、删除节点、查找节点、遍历节点等。

1.插入节点

Java链表的插入节点操作需要考虑两种情况:在链表头部插入节点和在链表尾部插入节点。
在链表头部插入节点的代码实现如下:

public void insertAtHead(int data) {
    Node newNode = new Node(data);
    newNode.next = head;
    head = newNode;
}

在链表尾部插入节点的代码实现如下:

public void insertAtTail(int data) {
    Node newNode = new Node(data);
    if (head == null) {
        head = newNode;
        return;
    }
    Node current = head;
    while (current.next != null) {
        current = current.next;
    }
    current.next = newNode;
}

2.删除节点

Java链表的删除节点操作需要考虑两种情况:删除链表头部节点和删除链表中间或尾部节点。
删除链表头部节点的代码实现如下:

public void deleteAtHead() {
    if (head == null) {
        return;
    }
    head = head.next;
}

删除链表中间或尾部节点的代码实现如下:

public void delete(int data) {
    if (head == null) {
        return;
    }
    if (head.data == data) {
        head = head.next;
        return;
    }
    Node current = head;
    while (current.next != null) {
        if (current.next.data == data) {
            current.next = current.next.next;
            return;
        }
        current = current.next;
    }
}

3.查找节点

Java链表的查找节点操作需要遍历整个链表,代码实现如下:

public Node search(int data) {
    Node current = head;
    while (current != null) {
        if (current.data == data) {
            return current;
        }
        current = current.next;
    }
    return null;
}

4.遍历节点

Java链表的遍历节点操作可以使用循环遍历或递归遍历,代码实现如下:

(1)循环遍历

public void traverse() {
    Node current = head;
    while (current != null) {
        System.out.print(current.data + " ");
        current = current.next;
    }
}

(2)递归遍历

public void traverseRecursive(Node node) {
    if (node == null) {
        return;
    }
    System.out.print(node.data + " ");
    traverseRecursive(node.next);
}

六、Java链表的实例说明

假设需要实现一个学生信息管理系统,每个学生包含姓名、学号、年龄等信息。可以使用Java链表来存储学生信息,每个节点表示一个学生,包含学生信息和指向下一个学生节点的指针。以下代码实现了学生链表的基本操作:

public class Student {
    public String name; // 学生姓名
    public String id; // 学生ID
    public int age; // 学生年龄
    public Student next; // 指向下一个学生的指针
}
public class StudentLinkedList {
    private Student head; // 链表头指针
    // 添加一个学生节点
    public void add(Student student) {
        if (head == null) { // 如果链表为空,则将新节点设置为头节点
            head = student;
            return;
        }
        // 如果链表不为空,则遍历到最后一个节点,并将新节点添加到最后一个节点的后面
        Student current = head;
        while (current.next != null) {
            current = current.next;
        }
        current.next = student;
    }
    // 删除指定ID的学生节点
    public void delete(String id) {
        if (head == null) { // 如果链表为空,则直接返回
            return;
        }
        if (head.id.equals(id)) { // 如果头节点就是要删除的节点,则将头节点指针指向下一个节点
            head = head.next;
            return;
        }
        // 如果要删除的节点不是头节点,则遍历链表,找到要删除的节点并删除
        Student current = head;
        while (current.next != null) {
            if (current.next.id.equals(id)) {
                current.next = current.next.next;
                return;
            }
            current = current.next;
        }
    }
    // 查找指定ID的学生节点
    public Student search(String id) {
        Student current = head;
        while (current != null) {
            if (current.id.equals(id)) {
                return current;
            }
            current = current.next;
        }
        return null; // 如果没有找到,则返回null
    }
    // 遍历整个链表并输出每个节点的信息
    public void traverse() {
        Student current = head;
        while (current != null) {
            System.out.println(current.name + " " + current.id + " " + current.age);
            current = current.next;
        }
    }
}

七、总结

Java链表是一种基础的数据结构,它具有插入和删除操作时间复杂度低的优点,但访问某个节点的时间复杂度较高。Java链表可以用于实现各种算法和数据结构,如栈、队列、哈希表等。在实际开发中,需要根据具体的场景选择合适的数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值