数据结构# 笔记【链表】@Gray

什么是链表?

链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。

1.简介

单链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。

  • 底层实现代码展示:
package com.Gray.LinkedList;

public class LinkedListImpl<E> {
    private class Node {
        //本结点存储了自己的元素,和下一个元素的结点
        public E e;
        public Node next;

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

        public Node(E e) {
            this(e, null);
        }

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

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

    private Node head;//头结点
    private int size;//记录链表中的元素

    public LinkedListImpl() {
        head = null;
        size = 0;
    }

    //获去链表中元素的个数
    public int getSize() {
        return size;
    }

    //返回链表是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    //向表头添加元素
    public void addFirst(E e) {
      /*  Node node = new Node(e);
        node.next = head;
        head = node;
      */
        head = new Node(e, head);
        size++;
    }

    //在链表的index(0-base)位置添加新的元素e
    //在链表中不是一个常规的操作,练习可能会用到
    public void add(int index, E e) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("Add failed.Illegal index.");
        }
        if (index == 0) {
            addFirst(e);
        } else {
            Node prev = head;
            for (int i = 0; i < index - 1; i++) {
                prev = prev.next;
            }

            Node node = new Node(e);
            node.next = prev.next;
            prev.next = node;
            size++;
        }
    }

    //在链表的末尾添加新的元素e
    public void addList(E e) {
        add(size, e);
    }
}

  • 内存图
    在这里插入图片描述
  • 向链表头添加元素
    在这里插入图片描述
  • 向链表中添加元素
    执行顺序别弄反,先用当前结点指向后一个元素,再用前一个元素结点指向当前元素…
    在这里插入图片描述
  • 删除链表中的元素

在这里插入图片描述

2.数组和链表的对比

  • 链表:
    优点: 它是真正的动态数据结构,不需要处理固定容量的问题.增删快
    缺点:丧失了随机访问的能力,查询慢(就物理存储来说,链表在内存中开辟的是一片不连续的物理空间),通过结点一点一点的去查询…

  • 数组:
    优点:查询快(就物理存储来说:数组在内存中开辟的是一片连续的物理空间)
    缺点:增删慢

3.常用方法:

  • 构造方法:
Constructor描述
LinkedList​()构造一个空列表。
LinkedList​(Collection<? extends E> c)构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。
  • 代码实现:
package com.Gray.LinkedList;
import java.util.LinkedList;
import java.util.List;

public class DemoLink {
    public static void main(String[] args) {
   		//创建链表集合
        List<String> list = new LinkedList<>();
    }
}
  • 常用方法
方法名说明
public boolean add(E e)将指定的元素追加到此集合的末尾
public int size()返回集合中的元素的个数
public E get(int index)返回指定索引处的元素
public E remove(int index)删除指定索引处的元素,返回被删除的元素
public boolean remove(Object o)删除指定的元素,返回删除是否成功
  • 代码示例:
package com.Gray.LinkedList.PracticeLinkedList;
import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        //添加元素
        list.add("大桥未久");
        list.add("新垣结衣");
        list.add("三上悠亚");
        list.add("明里紬");
        //遍历
        System.out.println("----------遍历----------");
        for (String s : list) {
            System.out.println(s);
        }

        //删除元素
        System.out.println("-------删除了[大桥未久]-----");
        list.remove("大桥未久");
        System.out.println(list);

        //链表大小
        System.out.println("---------链表大小---------");
        System.out.println(list.size());
    }
}

  • 运行截图:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值