Java的链表的创建、插入、修改、删除、查询等

本篇文章主要是记录Java的链表的创建、插入、修改、删除、查询等。

链表和数组的区别?

  • 从线性关系来看,链表和数组一样都是线性表;
  • 从内存结构来看,链表的内存空间是不连续的,数组的内存空间是连续的;
  • 从数据存储来看,链表的每个节点都有两个域,一个是数据域,专门用来存储值的;一个是指针域,用来存储下一节点的地址。

链表和数组的优劣比较:

  • 链表增加、删除快,查找慢;数组增加、删除慢,查找快;
  • 链表消耗的内存更大,因为每个节点除了存储数据之外,还需要存储下一节点的地址;

代码实现如下:

import java.util.Scanner;

class ListNode {
    int value;
    ListNode next;

    ListNode() {
    }

    ListNode(int value) {
        this.value = value;
        this.next = null;
    }

    /**
     * 初始化链表
     *
     * @return
     */
    public static ListNode init() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入添加链表的长度:");
        int n = sc.nextInt();
        ListNode headNode = new ListNode(n);
        ListNode nextNode = headNode;
        for (int i = 0; i < n; i++) {
            System.out.print("请输入第" + (i + 1) + "个节点的值:");
            int temp = sc.nextInt();
            ListNode node = new ListNode(temp);
            nextNode.next = node;
            nextNode = nextNode.next;
        }
        return headNode;
    }

    /**
     * 打印输出链表
     *
     * @param listNode
     */
    public void print(ListNode listNode) {
        if (listNode == null || listNode.next == null) {
            return;
        }
        ListNode ln = listNode.next;
        while (ln != null) {
            System.out.println(ln.value);
            ln = ln.next;
        }
    }

    /**
     * 修改指定位置链表的值
     *
     * @param listNode:修改的链表
     * @param n:修改位置
     * @param value:修改后的值
     * @return
     */
    public String update(ListNode listNode, int n, int value) {
        ListNode ln = listNode.next;
        if (listNode == null || ln == null || listNode.value < n) {
            return "该链表为空或链表未初始化";
        }
        for (int i = 0; i < n; i++) {
            ln = ln.next;
        }
        ln.value = value;
        return "更改成功!!";
    }

    /**
     * 计算链表的长度
     *
     * @param listNode:链表
     * @return
     */
    public int size(ListNode listNode) {
        ListNode ln = listNode.next;
        int n = 0;
        while (ln != null) {
            n++;
            ln = ln.next;
        }
        return n;
    }

    /**
     * 指定位置添加链表节点
     *
     * @param listNode:添加的链表
     * @param n:添加的位置
     * @param value:添加的值
     * @return
     */
    public void add(ListNode listNode, int n, int value) {
        ListNode ln = listNode.next;
        ListNode node = new ListNode(value);
        if (ln == null || n == 1) {
            node.next = listNode.next;
            listNode.next = node;
            return;
        }
        int j = 0;
        while (j < n - 2 && ln != null) {
            j++;
            if (ln.next == null) {
                break;
            }
            ln = ln.next;
        }
        if (ln.next != null) {
            node.next = ln.next;
        }
        ln.next = node;

    }

    /**
     * 指定位置删除链表节点
     *
     * @param listNode:删除的链表
     * @param value:删除的值
     * @return
     */
    public void del(ListNode listNode, int value) {
        ListNode ln = listNode.next;
        if (ln != null && ln.value == value) {
            listNode.next = ln.next;
        }
        ListNode temp = ln.next;
        while (temp != null) {
            if (temp.value == value) {
                ln.next = temp.next;
                break;
            }
            ln = temp;
            temp = temp.next;
        }
    }

    /**
     * 查找链表
     *
     * @param listNode:查找的链表
     * @param value:查找的值
     * @return
     */
    public void find(ListNode listNode, int value) {
        ListNode ln = listNode.next;
        while (ln != null) {
            if (ln.value == value) {
                System.out.println("找到该值!!");
                return;
            }
            ln = ln.next;
        }
        System.out.println("找不到该值!!");
    }

}

public class LinkedList {
    public static void main(String[] args) {

        ListNode init = ListNode.init();
//        init.del(init,2);
//        init.add(init, 3, 44);
        init.find(init, 3);
        //        System.out.println(init.update(init, 5, 5));
        init.print(init);
//        System.out.println(init.size(init));
//        listNode.print(init);
    }
}

 
 

本文为学习笔记,所参考文章均已附上链接,若有疑问请私信!

创作不易,如果对你有点帮助的话麻烦点个赞支持一下!

新手小白,欢迎留言指正!

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表是一种常见的数据结构,用于存储一系列的元素。在Java中,链表可以使用LinkedList类来实现。下面是关于Java链表的详细解释: 链表由节点(Node)组成,每个节点包含两部分:数据域(存储元素的值)和指针域(指向下一个节点的指针)。链表的头节点是链表的起始点,尾节点是链表的结束点。 Java中的LinkedList类实现了List接口和Deque接口,因此可以用作列表和双端队列。LinkedList在内存中以链式结构存储元素,相邻元素通过节点的指针连接。 与数组相比,链表的一个优势是可以快速地插入删除元素。由于链表中的元素在内存中不连续存储,所以插入删除只需要改变指针的指向,而不需要移动其他元素。然而,链表的一个劣势是访问特定索引的元素比较慢,因为需要从头节点开始遍历链表。 下面是一些常用的操作示例: 1. 创建一个空链表: LinkedList<String> list = new LinkedList<>(); 2. 在链表末尾添加元素: list.add("A"); list.add("B"); list.add("C"); 3. 在指定位置插入元素: list.add(1, "D"); // 在索引为1的位置插入元素D 4. 获取链表的大小: int size = list.size(); 5. 获取指定索引位置的元素: String element = list.get(2); // 获取索引为2的元素 6. 修改指定索引位置的元素: list.set(0, "E"); // 将索引为0的元素修改为E 7. 删除指定索引位置的元素: list.remove(1); // 删除索引为1的元素 8. 遍历链表: for (String element : list) { System.out.println(element); } 需要注意的是,LinkedList类不是线程安全的,如果在多线程环境中使用链表,需要进行适当的同步处理。此外,由于链表中的元素不是连续存储,所以对于大量元素的访问和操作,可能会导致性能下降。在这种情况下,可以考虑使用ArrayList或其他更适合的数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值