玩转数据结构——链表

843 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战


哈喽,大家好,我是一条。

今天聊聊数据结构,因为数组大家都很熟悉,由数组衍生出的问题也是最多,怎么说呢,

数组这个东西,你研究的再多,出了题还是可能不会,所以就不研究了,直接刷题。

而链表就不一样了,了解其基本结构,增删改查方法,大部分题都可以做。

学习过程也很简单,手写一个链表,再看看LinkedListed的源码,基本就会了。

链表

真正动态的数据结构,丧失了随机访问的能力

  • 深入的理解引用和指针
  • 深入理解递归
  • 辅助其它数据结构
  • 数据存储在节点【Node】中:
  • 每个节点是一个车厢,存放元素和下一个车厢的地址

下面是代码实现:

package com.yitiao.data_algorithms.structure.linked;

import lombok.Data;

/**
 * 
 */
public class LinkedList<E> {
    // 私有化,不暴露给用户
    private class Node{
        public Node next;
        public E e;

        // 三类构造方法
        public Node(Node node, E e) {
            this.next = node;
            this.e = e;
        }
        public Node(Node node) {
            this.next = node;
        }
        public Node(E e) {
            this.e = e;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "next=" + next +
                    ", e=" + e +
                    '}';
        }
    }

    private Node head;
    private int size;

    public int getSize(){
        return this.size;
    }

    public boolean isEmpty(){
        return size==0;
    }
    // 新增 删除 遍历

    /**
     * 头插法
     */
    public void addFirst(E e){
//        // 复制一个头结点
//        Node h=head;
//        // 创建新结点
//        Node newNode = new Node(e);
//        // 下一个结点的地址指向头结点
//        newNode.next=h;
//        // 新插入的结点作为新的头结点
//        head=newNode;

        // 一行
        head = new Node(head, e);
        // 容量+1
        size++;
    }

    /**
     * 尾插法
     */
    public void addLast(Node node){

    }

    /**
     *插入指定位置
     * 关键在于找到前一个node.next
     * node.next=prev.next
     * prev.next=node
     */
    public void addIndex(int index,E e){
        // 参数校验
        if(index<0 || index>size){
            throw new IllegalArgumentException("Parameter is not valid");
        }
        // 寻找prev
        Node prev = head;
        for (int i = 0; i < index-1; i++) {
            prev=prev.next;
        }
        new Node(e);
    }

    /**
     * 获取元素
     *      按下标
     *      头元素
     *      尾元素
     */
    public void get(int index){

    }

    public void remove(int index){

    }

    public void remove(E e){

    }

    public void getAll(){

    }
}

练习题

关于链表的练习题不多: 经典的比如:

  • 翻转链表
  • 是否是环形链表
  • 相交链表
  • 链表实现栈
  • 删除链表元素

等等,除了增删改查,再理解递归,可以链表你就成了

最后

最后,如果文章对你有帮助。

记得给文章点个赞呀!

也给 一条点个关注!