• 数据结构---链表(java)


    目录

    1. 链表

    2. 创建Node

    3. 增加

    4. 获取元素

    5. 删除

    6. 遍历链表

    7. 查找元素是否存在

    8. 链栈的实现

    9. 链队的实现 


    1. 链表

    • 数据存放在"Node"结点中

    优点:不用考虑扩容和缩容的问题,实现了动态存储数据

    缺点:没有随机访问的能力

    2. 创建Node

    先创建一个MyLinkedList类,初始化Node结点内部类

    1. private class Node {
    2. private T val;
    3. private Node next;
    4. public Node() {
    5. this.val = null;
    6. this.next = null;
    7. }
    8. public Node(T val) {
    9. this.val = val;
    10. this.next = null;
    11. }
    12. }

    3. 增加

    <1> 在头部添加

    1. public void addHead(T val) {
    2. Node node = new Node(val);
    3. node.next = this.header;
    4. this.header = node;
    5. this.size++;
    6. }

    <2> 在尾部添加

    1. public void tail(T val) {
    2. Node node = new Node(val);
    3. this.size++;
    4. if(header.next==null){
    5. this.header=node;
    6. return;
    7. }
    8. Node cur = header;
    9. while (cur.next!=null){
    10. cur = cur.next;
    11. }
    12. cur.next=node;
    13. }

    <3> 在任意位置添加

    1. public void add(int index, T val) {
    2. if (index < 0 || index > this.size) {
    3. throw new IllegalArgumentException("index is invalid");
    4. }
    5. //要插入的结点
    6. Node node = new Node(val);
    7. //新建一个虚拟头节点
    8. Node dummyHead = new Node(null);
    9. dummyHead.next = header;
    10. Node pre = dummyHead;
    11. //找到待插入位置的前一个结点
    12. for (int i = 0; i < index; i++) {
    13. pre = pre.next;
    14. }
    15. node.next = pre.next;
    16. pre.next = node;
    17. //更新头节点
    18. header = dummyHead.next;
    19. this.size++;
    20. }

    4. 获取元素

    <1> 获取头部元素

    1. public T getHead() {
    2. if (isEmpty()) {
    3. return null;
    4. }
    5. return header.val;
    6. }

    <2> 获取尾部元素

    1. public T getHail() {
    2. if (isEmpty()) {
    3. return null;
    4. }
    5. Node cur = this.header;
    6. while (cur.next != null) {
    7. cur = cur.next;
    8. }
    9. return cur.val;
    10. }

    <3> 获取任意节点元素

    1. public T get(int index) {
    2. if (index < 0 || index > this.size) {
    3. throw new IllegalArgumentException("index is invalid");
    4. }
    5. Node cur = this.header;
    6. int i = 1;
    7. while (i <= index) {
    8. cur = cur.next;
    9. i++;
    10. }
    11. return cur.val;
    12. }

    5. 删除

    <1> 通过下标删除结点

    1. public Optional removeByIndex(int index){
    2. if(index<0||index>=this.size){
    3. return Optional.empty();
    4. }
    5. //判断是否是头结点
    6. //使用虚拟头节点
    7. Node dummyNode = new Node(null);
    8. dummyNode.next = header;
    9. Node pre = dummyNode;
    10. int i=1;
    11. //寻找要删除的结点
    12. while(i<=index){
    13. pre = pre.next;
    14. i++;
    15. }
    16. //改变指针指向
    17. Node delNode = pre.next;
    18. pre.next = delNode.next;
    19. delNode.next = null;
    20. this.size--;
    21. this.header = dummyNode.next;
    22. return Optional.of(delNode.val);
    23. }

    <2> 通过值删除结点

    1. public void removeByVal(T val){
    2. if(isEmpty()){
    3. return;
    4. }
    5. Node dummyNode = new Node(null);
    6. dummyNode.next = header;
    7. Node pre = dummyNode;
    8. while(pre.next!=null){
    9. Node cur = pre.next;
    10. if(cur.val.equals(val)){
    11. pre.next=cur.next;
    12. cur.next=null;
    13. size--;
    14. }else {
    15. pre = pre.next;
    16. }
    17. }
    18. header = dummyNode.next;
    19. }

    <3> 不使用虚拟头结点删除元素

    1. public void removeWithoutDummyHead(T val){
    2. while(this.header!=null&&this.header.val.equals(val)){
    3. this.header = this.header.next;
    4. this.size--;
    5. }
    6. if(this.header==null){
    7. return;
    8. }
    9. //此时头节点一定不是要删除的结点
    10. Node pre = this.header;
    11. while(pre.next!=null){
    12. if(pre.next.val.equals(val)){
    13. pre.next = pre.next.next;
    14. this.size--;
    15. }else{
    16. pre = pre.next;
    17. }
    18. }
    19. }

    6. 遍历链表

    重写toString()方法,将他拼接成链表的样子

    1. @Override
    2. public String toString() {
    3. //创建一个临时结点
    4. Node cru = header;
    5. StringBuffer sb = new StringBuffer();
    6. while (cru != null) {
    7. sb.append(cru.val + "--->");
    8. cru = cru.next;
    9. }
    10. sb.append("Null");
    11. return sb.toString();
    12. }

    7. 查找元素是否存在

    1. public boolean contains(T val) {
    2. Node res = new Node(val);
    3. Node cur = header;
    4. for (int i = 0; i < this.size; i++) {
    5. if (res.val.equals(cur.val)) {
    6. return true;
    7. }
    8. cur = cur.next;
    9. }
    10. return false;
    11. }

    8. 链栈的实现

    1. public interface Stack {
    2. void push(T element);
    3. T pop();
    4. int getSize();
    5. boolean isEmpty();
    6. T peek();
    7. }
    1. public class LinkedStack implements Stack {
    2. private MyLinkedList data;
    3. public LinkedStack(MyLinkedList data) {
    4. this.data = data;
    5. }
    6. @Override
    7. public void push(T element) {
    8. this.data.addTail(element);
    9. }
    10. @Override
    11. public T pop() {
    12. Optional optional = this.data.removeByIndex(0);
    13. if(optional.isPresent()){
    14. return optional.get();
    15. }
    16. return null;
    17. }
    18. @Override
    19. public int getSize() {
    20. return this.data.getSize();
    21. }
    22. @Override
    23. public boolean isEmpty() {
    24. return this.data.isEmpty();
    25. }
    26. @Override
    27. public T peek() {
    28. return this.data.getHead();
    29. }
    30. }

    9. 链队的实现 

    1. public interface Queue{
    2. void offer(T ele);
    3. T poll();
    4. boolean isEmpty();
    5. int getSize();
    6. T getFront();
    7. }
    1. public class LinkedQueue implements Queue {
    2. private MyLinkedList data;
    3. public LinkedQueue(MyLinkedList myLinkedList) {
    4. this.data = myLinkedList;
    5. }
    6. @Override
    7. public void offer(Object ele) {
    8. this.data.addTail(ele);
    9. }
    10. @Override
    11. public Object poll() {
    12. return this.data.removeByIndex(0);
    13. }
    14. @Override
    15. public boolean isEmpty() {
    16. return this.data.isEmpty();
    17. }
    18. @Override
    19. public int getSize() {
    20. return this.data.getSize();
    21. }
    22. @Override
    23. public Object getFront() {
    24. return this.data.getHead();
    25. }
    26. }
  • 相关阅读:
    WebStorm 2024.1.1 Mac激活码 前端开发工具集成开发环境(IDE)
    基于matlab中点放炮各类地震波时距曲线程序
    flutter在mac系统中的环境搭建 - 1
    SpringCloud基础7——Redis分布式缓存
    SQL Server 创建表
    算法基础课——第一章 基础算法(二)
    2024双非网安保华五(中科大)电子信息经验分享
    2022.11.28总结
    目标检测——day44 用于水下物体检测与颜色转换联合学习的轻量级深度神经网络
    c++ ,python监控 进程 状态 fork
  • 原文地址:https://blog.csdn.net/weixin_64704029/article/details/132916425