栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数据结构-单链表

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构-单链表

前言

链表使用地方较多,多出源码中均有出现的地方,毕竟链表作为基础数据结构在申请内存时比数组唯一好处就是不用申请连续内存(数组在内存中必须是连续的),因此掌握链表很有必要

代码

下面以java代码为例 写了个简单的实现

package com.chinanums.hh.study.base;



public class SinglelinkedList {

    // 头结点
    private Node head;
    // 尾结点
    private Node tail;
    // 链表大小
    private int count;


    
    public void add(T data) {
        insert(new Node(data));
    }

    
    public void add(T data,int index){insert(new Node<>(data),index);}
   
    
    private void insert(Node tNode) {

        // 说明是第一次插入
        if (head == null) {
            head = tNode;
        } else {
            // 追加到队列尾部
            tail.next = tNode;
        }
        tail = tNode;
        count++;
    }

    
    private void insert(Node tNode, int index) {

        Node p = head;
        // 说明是第一次插入
        if (head == null) {
            head = tNode;
            tail = head;
            count++;
        } else {
            // 这个作为指针 记录查找到符合值的上一个节点
            Node q = null;
            int i = 0;
            while (p != null && i != index) {
                q = p;
                p = p.next;
                i++;
            }

            // 说明找到了
            if (p != null) {

                // q为null 说明即将插入的tNode是头结点
                if (q == null) {
                    tNode.next = head;
                    head = tNode;

                    // 插入到队列中间
                } else {
                    // q 上一个节点 改变上一个节点的next指向
                    q.next = tNode;
                    // 保持连贯 新节点next指向原节点p
                    tNode.next = p;
                }
                count++;

                // 插入到尾部
            } else if (q == tail) {
                tail.next = tNode;
                tail = tNode;
                count++;
            }
        }
    }

    
    public T find(int index) {
        // 获取当前队列中index的值
        if (index >= count || index < 0) {
            return null;
        }
        // 从头开始找
        Node p = head;
        int i = 0;
        // 如果链表中没有 那么while循环走完之后 p节点应该是个null
        while (p != null && i != index) {
            p = p.next;
            i++;
        }

        // p!=null  说明找到了符合下标的
        if (p != null) {
            return p.data;
        }

        return null;
    }


    
    public void remove(T data) {
        // 从头开始遍历查找删除
        Node p = head;
        // 这个作为指针 记录查找到符合值的上一个节点
        Node q = null;
        while (p != null && p.data != data) {
            q = p;
            p = p.next;
        }

        // 说明找到了
        if (p != null) {

            // 找到的节点可能是首尾 或者中间节点

            // q为null 说明即将删除的p是头结点
            if (q == null) {
                head = p.next;
            } else {
                // 删除节点的下一个节点引用赋值给上一个节点的next
                q.next = p.next;
            }
            count--;
        }
    }

    public int size() {
        return count;
    }

    
    private static class Node {
        // 数据
        private T data;
        private Node next;

        Node(T data) {
            this.data = data;
        }
    }

}

链表作为大厂面试笔试中较高的出现频率 我觉得也有必要学

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459182.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号