单链表的实现

之前学习了顺序表,接下来把链表的功能给模拟实现一遍


链表

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。

链表的结构有很多种,但是我们重点掌握两种:

无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

整体结构就长这个样子

无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。


链表的实现

第一个节点也称为头结点 head

依靠head 节点就可以找到所有的节点

单链表的模拟实现

creatList为我们已经创建好了一个链表,在它的基础上我们可以进行操作

实现接口的功能

一共实现的功能就这么多 现在我们先来一一实现


一.打印链表

注:一般情况不动head那个节点,创建一个cur节点来代替head节点,让它永远指向头结点

java 复制代码
​​​​​​public void display() {
        if(head == null) {
            return ;
        }
        ListNode cur = head;
        while(cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
    }

二. 查找是否包含关键字key是否在单链表当中
java 复制代码
public boolean contains(int key) {
        ListNode cur = head;
        while(cur != null) {
            if(cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;

    }
三.得到单链表的长度
java 复制代码
 public int size() {
        int count = 0;
        ListNode cur = head;
        while(cur != null) {
            count++;
            cur =  cur.next;
        }
        return  count;
    }

这几个都是遍历整个链表,所有会比较轻松

四.头插法

思路:

考虑head等于null的情况下,直接让node = head 就行 这题考虑与不考虑都无所谓

java 复制代码
  public void addFirst(int data) {
        ListNode node = new ListNode(data);
        if(head == null) {
            head = node;
        } else {
            node.next = head;
            head = node;
        }
    }
五.尾插法

也是一样的 如果head等于null的话 直接让head = node

java 复制代码
public void addLast(int data) {
        ListNode node = new ListNode(data);
        ListNode cur = head;
        if(head == null) {
            head = node;
        } else {
            while(cur.next != null) {
                cur = cur.next;
            }
            cur.next = node;
        }
    }
六.任意位置插入,第一个数据节点为0号下标

index = 0 或者等于size()大小时候,就可以用到头插和尾差,再者看看index值合法不合法

java 复制代码
 public void addIndex(int index, int data) {
        ListNode node  = new ListNode(data);
        if(index < 0 || index >= size()) {
            throw new InderException("index不合法");
        }
        if(index == 0) {
            addFirst(data);
            return;
        }
        if(index == size()) {
            addLast(data);
            return;
        }
        else {
            ListNode cur =  head;
            ListNode curPre = cur;
            while( index != 0) {
                curPre = cur;
                cur = cur.next;
                index--;
            }
            curPre.next = node;
            node.next = cur;
        }
    }

七. 删除第一次出现关键字为key的节点

万一第一个节点就是我们要删除的,直接将head 节点移动到下一个节点

java 复制代码
    public void remove(int key) {
        if(head == null) {
            return;
        }
        if(head.val == key) {
            head = head.next;
            return;
        }
        ListNode node = new ListNode(key);
        ListNode cur = head.next;
        ListNode curPre = head;
        while(cur != null) {
            if(cur.val == key) {
                curPre.next = cur.next;
                return;
            }
            curPre = curPre.next;
            cur = cur.next;
        }
    }

八.删除所有值为key的节点

头结点也是最后一个判断,只有这种,才可以避免头结点是要删除的节点的问题

java 复制代码
    public void removeAllKey(int key) {
        if(head == null) {
            return ;
        }
        ListNode curPre = head;
        ListNode cur = head.next;
        while(cur != null) {
            if(cur.val == key) {
                curPre.next = cur.next;
                cur = cur.next;
            }
            else {
                cur = cur.next;
                curPre = curPre.next;
            }
        }
        if(head.val == key) {
            head = head.next;
        }
        
    }

八.清空链表
java 复制代码
 public void clear() {
        head = null;

    }

直接让head 为空就行


ok以上就是整个单链表的模拟过程,这里只是简单入个门而已

单链表一般在笔试面试题常常出现,所有我们要经常刷题才能更好的掌握它

这里为大家整理好了一些题目

力扣+牛客网在线编程_算法篇_面试必刷TOP101


以前写的 之前因为个人原因断了 现在慢慢更新 感谢!!!

相关推荐
bing_1586 分钟前
Java 中求两个 List集合的交集元素
java·list
工业互联网专业24 分钟前
基于springboot+vue的高校社团管理系统的设计与实现
java·vue.js·spring boot·毕业设计·源码·课程设计
九圣残炎26 分钟前
【ElasticSearch】 Java API Client 7.17文档
java·elasticsearch·搜索引擎
m0_748251521 小时前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
Bro_cat2 小时前
深入浅出JSON:数据交换的轻量级解决方案
java·ajax·java-ee·json
等一场春雨2 小时前
Java设计模式 五 建造者模式 (Builder Pattern)
java·设计模式·建造者模式
hunzi_12 小时前
Java和PHP开发的商城系统区别
java·php
V+zmm101342 小时前
教育培训微信小程序ssm+论文源码调试讲解
java·数据库·微信小程序·小程序·毕业设计
十二同学啊2 小时前
Spring Boot 中的 InitializingBean:Bean 初始化背后的故事
java·spring boot·后端
我劝告了风*2 小时前
NIO | 什么是Java中的NIO —— 结合业务场景理解 NIO (二)
java·nio