数据结构 链表
介绍
概念
哎哟,小伙伴们,今天咱们聊聊计算机里头那些神奇的东西——数据结构。说到数据结构,那可是计算机世界里的一道亮丽风景线啊。咱们今天就来聊聊链表这个家伙。
先说链表这个家伙长得咋样吧。它就像一条长长的蛇,每个节点都紧紧地连在一起,形成了一个动态的序列。这个家伙的特点呢,就是灵活性非常高。你可以把节点往前挪,也可以把节点往后拖,还可以在中间插入、删除节点,形成各种奇怪的形状。
优缺点
那链表有啥优缺点呢?优点嘛,就是它可以实现高效的插入和删除操作。比如说,你要把一个新节点插入到链表的某个位置,只需要修改一下前后两个节点的指针就可以了。缺点嘛,不能随机查找,必须从第一个开始遍历,查找效率比较低,链表查询的时间复杂度是 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);
实现
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 发布!