无头双向非循环链表实现

news2024/9/22 23:33:36

无头双向非循环链表实现

  • Ilist.java接口:
  • MyLinkedList.java:

无头双向非循环链表大致与无头单向非循环差不多,只不过每个节点多了个prev引用,可以从后一个节点找到前一个节点。并且除了头节点head,双链表还多了个尾节点tail

在这里插入图片描述

要模拟实现无头双向非循环链表,同样需要创建三个文件:IList.java接口,MyLinkedList.java文件,test.java测试文件,下面仅展示IList.java接口和MyLinkedList.java文件

Ilist.java接口:

 // 2、无头双向链表实现
 public class LinkedList {
     //头插法
     public void addFirst(int data);
     //尾插法
     public void addLast(int data);
     //任意位置插入,第一个数据节点为0号下标
     public boolean addIndex(int index,int data);
     //查找是否包含关键字key是否在单链表当中
     public boolean contains(int key);
     //删除第一次出现关键字为key的节点
     public void remove(int key);
     //删除所有值为key的节点
     public void removeAllKey(int key);
     //得到单链表的长度
     public int size();
     public void display();
     public void clear();
 }

MyLinkedList.java:

public class MyLinkedList implements IList{
    static class ListNode {
        public int val;
        public ListNode next;
        public ListNode prev;

        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;
    public ListNode tail;

    @Override
    public void addFirst(int data) {
        ListNode node = new ListNode(data);
        if(head == null) {
            head = tail = node;
            return;
        }
        node.next = head;
        head.prev = node;
        head = node;
    }

    @Override
    public void addLast(int data) {
        ListNode node = new ListNode(data);
        if(head == null) {
            head = tail = node;
            return;
        }
        node.prev = tail;
        tail.next = node;
        tail = node;
    }

    @Override
    public void addIndex(int index, int data) {
        int len = size();
        if(index < 0 || index > len) {
            return;
        }
        if(index == 0) {
            addFirst(data);
            return;
        }
        if(index == len) {
            addLast(data);
            return;
        }
        ListNode node = new ListNode(data);
        ListNode cur = findIndex(index);
        node.prev = cur;
        node.next = cur.next;
        cur.next.prev = node;
        cur.next = node;
    }

    private ListNode findIndex(int index) {
        ListNode cur = head;
        for(int i = 0; i < index-1; i++) {
            cur = cur.next;
        }
        return cur;
    }

    @Override
    public boolean contains(int key) {
        ListNode cur = head;
        while(cur != null) {
            if(cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

    @Override
    public void remove(int key) {
        if(head == null) {
            return;
        }
        ListNode del = findKeyOfIndex(key);
        if(del == null) {
            return;
        }
        if(del.prev == null) {
            head = head.next;
            if(head != null) {
                head.prev = null;
            }
            return;
        }
        if(del.next == null) {
            tail = tail.prev;
            tail.next = null;
            return;
        }
        del.prev.next = del.next;
        del.next.prev = del.prev;
    }
    private ListNode findKeyOfIndex(int key) {
        ListNode cur = head;
        ListNode last = tail;
        while(cur != last) {
            if(cur.val == key) {
                return cur;
            }
            if(last.val == key) {
                return last;
            }
            cur = cur.next;
            last = last.prev;
        }
        if(cur.val == key) {
            return cur;
        }
        return null;
    }

    @Override
    public void removeAllKey(int key) {
        if(head == null) {
            return;
        }
        ListNode start = head;
        ListNode cur = head.next;
        while(cur != null) {
            if(cur.val == key) {
                start.next = cur.next;
                cur = cur.next;
                if(cur != null) {
                    cur.prev = start;
                }
            }else {
                start = cur;
                cur = cur.next;
            }
        }
        if(head.val == key) {
            head = head.next;
        }
    }

    @Override
    public int size() {
        int len = 0;
        ListNode cur = head;
        while(cur != null) {
            len++;
            cur = cur.next;
        }
        return len;
    }

    @Override
    public void clear() {
        ListNode cur = head;
        while(cur != null) {
            ListNode curN = cur.next;
            cur.prev = null;
            cur.next = null;
            cur = curN;
        }
        head = null;
        tail = null;
    }

    @Override
    public void display() {
        ListNode cur = head;
        while(cur != null) {
            System.out.print(cur.val+" ");
            cur = cur.next;
        }
        System.out.println();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自定义多选组件

一.业务场景 选择用印公司时&#xff0c;需要选择多个公司&#xff0c;一个公司对应一个实际使用人 点击用印单位&#xff0c;弹出选择公司窗口&#xff0c;选择使用人&#xff0c;同时带上公司ID,点击确定按钮&#xff0c;将公司和使用人回显在用印单位上 二.上代码 wxml代码…

快递查询|阿里云实现调用API接口

整体请求流程 介绍&#xff1a; 本次解析通过阿里云云市场的云服务来实现程序中对快递包裹实时监控&#xff0c;首先需要准备选择一家可以提供快递查询的商品。 https://market.aliyun.com/apimarket/detail/cmapi00065859#skuyuncode5985900001 步骤1: 选择商品 如图点击…

复杂表单一键填充,让信息输入更轻松

随着网络购物成为日常生活的一部分&#xff0c;用户在多个购物应用中重复输入地址信息带来的效率问题日益凸显。同样&#xff0c;在为家人预订车票或机票时&#xff0c;添加新的购票人信息也因难以记忆家人详细信息而变得繁琐。 为了解决这些用户痛点&#xff0c;HarmonyOS SD…

企业响应式网站建站模版源码系统 海量模版随心选择 带完整的安装代码包以及搭建部署教程

系统概述 企业响应式网站建站模版源码系统”是一套完整、高效的网站建设解决方案。它旨在为企业提供一站式的网站建设服务&#xff0c;无需专业的编程知识&#xff0c;即可通过简单的操作&#xff0c;快速搭建出美观、专业的企业网站。该系统不仅包含了丰富的网站模版&#xf…

【qt】客户端连接到服务器

获取到IP地址和端口号. 通过connectToHost() 来进行连接. 对于客户端来讲,只需要socket即可. 客户端连接服务端只需要使用套接字(Socket)来进行通信。客户端通过创建一个套接字来连接服务端&#xff0c;然后可以通过套接字发送和接收数据。套接字提供了一种简单而灵活的方式来…

勘测院如何实现可控便捷的图纸安全外发?

勘测院&#xff0c;也称为勘测设计研究院或勘测设计院&#xff0c;是进行与地质、地形和地貌有关的勘察测量的单位&#xff0c;为各类工程项目提供准确的地质数据和设计依据。 勘测院会产生各类包括图纸在内的文件&#xff0c;如&#xff1a; 1、项目相关文件&#xff1a;项目…

不同的企业如何量身制定数据治理体系

在当今数据驱动的商业环境中&#xff0c;数据治理已成为企业不可或缺的一部分。然而&#xff0c;由于行业、规模、业务模式的差异&#xff0c;不同企业在制定数据治理体系时面临着各自独特的挑战和机遇。本文将探讨不同企业如何根据自身特点量身制定数据治理体系。 明确企业数据…

基于Rspack实现大仓应用构建提效实践|得物技术

一、实践背景 随着项目的逐步迭代&#xff0c;代码量和依赖的逐渐增长&#xff0c;应用的构建速度逐步进入缓慢期。以目前所在团队的业务应用来看&#xff08;使用webpack构建&#xff09;&#xff0c;应用整体构建耗时已经普遍偏高&#xff0c;影响日常开发测试的使用效率&am…

浅谈后置处理器之JSON提取器

浅谈后置处理器之JSON提取器 JMeter 的 JSON 提取器&#xff08;JSON Extractor&#xff09;是一个强大的后置处理器&#xff0c;它允许用户从HTTP响应、数据库查询或其他类型的响应中提取JSON数据&#xff0c;并将这些数据存储为变量&#xff0c;以便在后续的请求中重用。这对…

人工智能行业应用-垃圾识别一

垃圾识别应用主要体现在AI图像垃圾识别技术上&#xff0c;这是一种基于人工智能和计算机视觉技术的图像处理技术&#xff0c;广泛应用于各个领域以提高垃圾处理的效率和准确性。 1、垃圾识别效果图 2 垃圾识别任务分析 综合利用Python语言、Qt开发模块&#xff0c;OpenCV开发模…

python使用tkinter加载rtsp视频流

简介 最近有个需求&#xff0c;需要开发个桌面应用工具&#xff0c;可是实时显示rstp视频&#xff0c;于是想到了用python自带的tkinter 来开发&#xff0c;最后打包成exe应用。 import cv2 import random import threading from tkinter import * from PIL import Image, Ima…

group 与查询字段

需求 每周周一&#xff0c;统计菜单在过去一周&#xff0c;点击次数&#xff0c;和点击人数&#xff08;同一个人访问多次按一次计算&#xff09; 表及数据 日志表 CREATE TABLE t_data_log ( id varchar(50) NOT NULL COMMENT 主键id, operation_object varchar(500) DE…

麦克风领夹式的哪个牌子最好,一文告诉你无线领夹麦克风哪款好

​在选择无线麦克风时&#xff0c;多样化的市场需求和不断进步的技术&#xff0c;使得从专业级到入门级的各类产品应运而生&#xff0c;满足不同场景和预算的需求。为了让消费者在众多选择中找到适合自己的无线麦克风&#xff0c;我们基于市场销量和用户口碑&#xff0c;整理出…

Java中的Set系列集合超详解

Set List是有序集合的根接口&#xff0c;Set是无序集合的根接口&#xff0c;无序也就意味着元素不重复。更严格地说&#xff0c;Set集合不包含一对元素e1和e2 &#xff0c;使得e1.equals(e2) &#xff0c;并且最多一个空元素。   使用Set存储的特点与List相反&#xff1a;元素…

界面组件Kendo UI for React 2024 Q2亮点 - 生成式AI集成、设计系统增强

随着最新的2024年第二季度发布&#xff0c;Kendo UI for React为应用程序开发设定了标准&#xff0c;包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示&#xff0c;从设计到代码的生产力增强、可访问性…

219.贪心算法:柠檬水找零(力扣)

代码解决 class Solution { public:bool lemonadeChange(vector<int>& bills) {int num50, num100; // 初始化5美元和10美元的计数器for(int i0; i < bills.size(); i) // 遍历所有账单{if(bills[i]5) // 如果账单是5美元{num5; // 增加5美元的计数continue; // …

永磁同步电机谐波抑制算法(7)——基于自适应陷波(adaptive notch filter,ANF)的精确谐波电流抑制策略

1.前言 1.1经典谐波抑制策略存在的问题 在之前的谐波抑制专题中&#xff0c;主要介绍了两种谐波抑制策略——基于多同步旋转坐标系的谐波抑制策略以及基于比例积分谐振PIR调节器的谐波抑制策略&#xff0c;同时还介绍了这两种策略的改进办法&#xff0c;进而使得这两种策略在…

视频号矩阵系统源码,实现AI自动生成文案和自动回复私信评论,支持多个短视频平台

在当今短视频蓬勃发展的时代&#xff0c;视频号矩阵系统源码成为了自媒体人争相探索的宝藏。这一强大的技术工具不仅能帮助我们高效管理多个短视频平台&#xff0c;更能通过AI智能生成文案和自动回复私信评论&#xff0c;为自媒体运营带来前所未有的便利与效率。 一、视频号矩…

【算法】接雨水

难度&#xff1a;困难 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例&#xff1a; 示例1 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是…

开放式耳机哪款好一点?开放式耳机科普五款推荐!

“选择开放式耳机真的太难了” “哥&#xff0c;怎么才能选到心仪的开放式耳机啊” 这种评论总是会出现后台或者现实的朋友也会问起来&#xff0c;所以作为耳机测评的博主&#xff0c;在这里给大家科普一下到底一款好用的开放式耳机到底怎么选&#xff0c;这篇文章我花了三天…