模仿王朔的语气聊数据结构中的链表是种什么样的体验?

数据结构 链表

介绍

概念

哎哟,小伙伴们,今天咱们聊聊计算机里头那些神奇的东西——数据结构。说到数据结构,那可是计算机世界里的一道亮丽风景线啊。咱们今天就来聊聊链表这个家伙。

先说链表这个家伙长得咋样吧。它就像一条长长的蛇,每个节点都紧紧地连在一起,形成了一个动态的序列。这个家伙的特点呢,就是灵活性非常高。你可以把节点往前挪,也可以把节点往后拖,还可以在中间插入、删除节点,形成各种奇怪的形状。

优缺点

那链表有啥优缺点呢?优点嘛,就是它可以实现高效的插入和删除操作。比如说,你要把一个新节点插入到链表的某个位置,只需要修改一下前后两个节点的指针就可以了。缺点嘛,不能随机查找,必须从第一个开始遍历,查找效率比较低,链表查询的时间复杂度是 O (n)。

使用场景

链表的应用场景也是非常广泛的。比如说,我们经常用到的文件系统就是一个典型的链表应用。文件系统里头有很多个文件,每个文件都有一个唯一的编号。而这些编号又是一个链表,每个节点都包含了一个文件名和一个编号。当我们要查找某个文件的时候,只需要沿着这个链表一路找下去就行了。当然了,这只是一个简单的例子,实际上链表在计算机科学中有很多其他的用途,比如操作系统、编译器、数据库等等。

设计

 void addFirst(E e);

 void addLast(E e);

 E removeFirst();

 E removeLast();

 E getFirst();

 E getLast();

 boolean contains(E e);

 void set(int index, E e);

实现

LinkedList.png) LinkedList-remove.png

package com.sssd.learns.structure;

/**
 * @author sssd
 * @careate 2023-07-15-20:12
 */
public class LinkedList<E> {

    private class Node {
        E e;
        Node next;

        Node(E e, Node next) {
            this.e = e;
            this.next = next;
        }

        Node(E e) {
            this.e = e;
            this.next = null;
        }

        Node() {
            this(null, null);
        }

        @Override
        public String toString() {
            return e.toString();
        }
    }

    private Node head;

    private int size;

    public LinkedList() {
        head = new Node(null, null);
        size = 0;
    }

    public void add(int index, E e) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("param index fail...");
        }
        Node prev = head;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        prev.next = new Node(e, prev.next);
        size++;
    }

    public void addFirst(E e) {
        add(0, e);
    }

    public void addLast(E e) {
        add(size - 1, e);
    }

    public E remove(int index) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("param index fail...");
        }
        Node prev = head;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        Node delNode = prev.next;
        prev.next = delNode.next;
        delNode.next = null;
        return delNode.e;
    }

    public E removeFirst() {
        return remove(0);
    }

    public E removeLast() {
        return remove(size - 1);
    }

    public void set(int index, E e) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("param index fail...");
        }
        Node cur = head.next;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        cur.e = e;
    }

    public E get(int index) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("param index fail...");
        }
        Node cur = head.next;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return cur.e;
    }

    public E getFirst() {
        return get(0);
    }

    public E getLast() {
        return get(size - 1);
    }


    public boolean contains(E e) {
        Node cur = head.next;
        while (cur != null) {
            if (cur.e.equals(e)) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        Node cur = head.next;
        while (cur != null) {
            builder.append(cur + "->");
            cur = cur.next;
        }
        builder.append("NULL");
        return builder.toString();
    }
}

作者:傻傻三多

出处:https://www.sssd.top/archives/1688033050884

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

本文由博客一文多发平台 OpenWrite 发布!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值