「这是我参与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(){
}
}
练习题
关于链表的练习题不多: 经典的比如:
- 翻转链表
- 是否是环形链表
- 相交链表
- 链表实现栈
- 删除链表元素
等等,除了增删改查,再理解递归,可以链表你就成了
最后
最后,如果文章对你有帮助。
记得给文章点个赞呀!
也给 一条点个关注!