编程导航算法通关村第 1关 | 单链表的操作

news2024/11/28 18:43:32

编程导航算法通关村第 1关 | 链表的操作

文章目录

  • 编程导航算法通关村第 1关 | 链表的操作
    • 单链表
      • 链表的定义
      • 初始化
      • 链表的遍历
      • 获取链表的长度
      • 链表的插入
      • 链表的节点的删除
    • 双向链表
      • 节点的定义
      • 双向链表的定义
      • 节点的打印
      • 获取长度
      • 头部插入元素
      • 尾部插入元素
      • 链表的删除

单链表

链表的定义

/**
 * 单链表节点的定义
 */
public class ListNode {
    public int val;
    public ListNode next;

    ListNode(int x) {
        val = x;
        //这个一般作用不大,写了会更加规范
        next = null;
    }
}

初始化

  public static ListNode init(ListNode head) {
        int i = 2;
        ListNode temp = head;
        while (i <= 10) {
            ListNode listNode = new ListNode(i);
            temp.next = listNode;
            temp = temp.next;
            i++;
        }
        return head;
    }

链表的遍历

/**
     * 遍历链表
     */
    public static void print(ListNode head) {
        ListNode temp = head;
        while (temp != null) {
            System.out.println(temp.val);
            temp = temp.next; // 向后移动指针
        }
    }

获取链表的长度

 /**
     * 获取链表的长度
     */
    public static int getLength(ListNode head) {
        ListNode temp = head;
        int length = 0;
        while (temp != null) {
            temp = temp.next; // 向后移动指针
            length++;
        }
        return length;
    }

链表的插入

  • 在链表的插入中,我们需要考虑三种情况
  • 头结点前插入:直接将newNode的next指向head,然后将head指向为第一个节点(newNode)
 newNode.next = head;
            head = newNode;
            return head;
  • 尾结点后插入:将指针指向节点的末尾
 ListNode temp = head;
//            先将指针移动到最后
            while (temp.next != null) {
                temp = temp.next;

            }
            temp.next = newNode;

            return head;
         
  • 中间插入:需要将指针指向待插入位置的前一个节点
    在这里插入图片描述
//        中间插入
        ListNode temp = head;

        int i = 1;
//        将temp移动到前一个的位置,此处的位置应该是posttion-1
        while (i < posttion - 1) {
            temp = temp.next;
            i++;
        }
//        将新节点插入到temp之后
        newNode.next = temp.next;
        temp.next = newNode;

        return head;
  • 完整代码
 /**
     * 插入链表 postition的范围是1——length
     */
    public static ListNode insert(ListNode head, ListNode newNode, int posttion) {
//        分为三种情况进行讨论
//        判断参数是否合法
        if (head == null) {
            return null;
        }
        if (newNode == null) {
            return null;
        }
        int length = getLength(head);
        if (posttion <= 0 || posttion > length) {
            return null;
        }

//        头部插入
        if (posttion == 1) {
            newNode.next = head;
            head = newNode;
            return head;
        }
//        尾部插入
        if (posttion == length) {
            ListNode temp = head;
//            先将指针移动到最后
            while (temp.next != null) {
                temp = temp.next;

            }
            temp.next = newNode;

            return head;
        }
//        中间插入
        ListNode temp = head;

        int i = 1;
//        将temp移动到前一个的位置,此处的位置应该是posttion-1
        while (i < posttion - 1) {
            temp = temp.next;
            i++;
        }
//        将新节点插入到temp之后
        newNode.next = temp.next;
        temp.next = newNode;

        return head;
    }    

链表的节点的删除

  • 需要考虑三种情况
    • 节点是头节点
    • 节点是尾节点
    • 节点是中间节点
 /**
     * 单链表的删除
     */
    public static ListNode delete(ListNode head, int posttion) {
//
        if (head == null) {
            return null;
        }
        if (posttion <= 0 || posttion > getLength(head)) {
            return null;
        }


//        删除头结点
        if (posttion == 1) {
            head = head.next;
            return head;
        }
//    尾结点
        if (posttion == getLength(head)) {
            ListNode temp = head;
            while (temp.next.next != null) {
                temp = temp.next;
            }
            temp.next = null;
//
            return head;
        }

//   删除中间节点
        ListNode temp = head;

        int i = 1;
//   移动到前一个
        while (i < posttion - 1) {
            temp = temp.next;
            i++;
        }

//        删除他的下一个节点
        temp.next = temp.next.next;

        return head;
    }

双向链表

节点的定义

package com.lmx.project.first.bronze;

class DoubleNode {
    public int data;    //数据域
    public DoubleNode next;    //指向下一个结点
    public DoubleNode prev;

    public DoubleNode(int data) {
        this.data = data;
    }

    //打印结点的数据域
    public void displayNode() {
        System.out.print("{" + data + "} ");
    }
}

双向链表的定义

  • 需要定义头结点、尾结点
  private DoubleNode first; // 头结点
    private DoubleNode last; // 尾结点

    public DoublyLinkList() {
        first = null;
        last = first;
    }

节点的打印

  * 正序打印
     */
    public void printOrder() {
        DoubleNode temp = first;
        while (temp != null) {
            temp.displayNode();
            temp = temp.next;
        }
    }

    /**
     * 导入打印
     */
    public void printRevereOrder() {
        DoubleNode temp = last;
        while (temp != null) {
            temp.displayNode();
            temp = temp.prev;
        }
    }

获取长度

  /**
     * 获取链表长度
     */
    public int getLength() {

        int length = 0;
        DoubleNode temp = first;
        while (temp != null) {
            length++;
            temp = temp.next;
        }

        return length;
    }

头部插入元素

 /**
     * 头部插入元素
     */
    public void insertFirst(int data) {
        DoubleNode newNode = new DoubleNode(data);
//        没有头结点的情况
        if (first == null) {
            first = newNode;
            last = first;
            return;
        }

        newNode.next = first;
        first.prev = newNode;
        first = newNode;

    }

尾部插入元素

  /**
     * 尾插入元素
     */
    public void insertLast(int data) {

        DoubleNode newNode = new DoubleNode(data);

        if (first == null) {
            first = newNode;
            last = first;
            return;
        }


        newNode.prev = last;
        last.next = newNode;
        last = newNode;
    }
  • 中间插入元素
    在这里插入图片描述
  /**
     * 中间插入元素
     */
    public void insert(int data, int position) {

        int length = getLength();
        if (position <= 0 || position > length) {
            return;
        }

        if (position == 1) {
            insertFirst(data);
            return;
        }
        if (position == length + 1) {
            insertLast(data);
            return;
        }
        DoubleNode newNode = new DoubleNode(data);
//       中间的插入
        DoubleNode temp = first;
        int i = 1;
        while (i < position - 1) {
            temp = temp.next;
            i++;
        }
//        将结点插入到temp后面
        temp.next.prev = newNode;
        newNode.next = temp.next;
        temp.next = newNode;
        newNode.prev = temp;

    }

链表的删除

在这里插入图片描述

/**
     * 链表的删除
     */
    public DoubleNode delete(int key) {
//
        DoubleNode temp = first;
        while (temp != null && temp.data != key) {
            temp = temp.next;
        }
        if (temp == null) {
            return temp;
        }
//        如果是头结点
        if (temp == first) {

            first = first.next;
            first.prev = null;

        } else if (temp == last) {
            //        如果是尾结点

            last.prev.next = null;

        } else {
            //        如果是中间节点
            temp.next.prev = temp.prev;
            temp.prev.next = temp.next;
            temp.next = null;
            temp.prev = null;

        }
        return temp;


    }

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

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

相关文章

InnoDB锁内存结构

假如说 我们SELECT * FROM table WHERE a < 10000 FOR UPDATE 那岂不是要加几万条锁 这消耗老鼻子内存了 这些锁有很多地方都是一样的啊 能不能通过某种方式整理整理节省点内存呢? 答案是能 如果符合下边这些条件&#xff1a; 在同一个事务中进行加锁操作 被加锁的记录…

Redis远程字典服务

目录 前言 1.NoSQL 1.1NOSQL和关系型数据库比较 1.2非关系型数据库的优势 1.3关系型数据库的优势 ​编辑 2.主流的NOSQL产品 键值(Key-Value)存储数据库 列存储数据库 文档型数据库 图形(Graph)数据库 3.Redis简介 redis的应用场景 4.命令操作 4.1字符串类型 s…

python根据excel数据,基于散点图绘制棋盘图

文章目录 一、需求二、处理方式三、代码实现 一、需求 根据可视化的需要&#xff0c;下图的数据需要使用棋盘图的样式来展示&#xff0c; 原始数据&#xff1a; 最终效果图&#xff1a; 二、处理方式 1、先将DataFrame数据转换为Numpy数组&#xff1b; 2、先使用np.transp…

Window下Mysql5.x和8.x版本切换

在最近的工作中需要使用Mysql5.x版本&#xff0c;但以前的自己项目开发使用的Mysql版本都是8.x。因此特意去查资料看了一下&#xff0c;下边是如何在window下实现两个不同版本Mysql的切换。 既然是不同的Mysql&#xff0c;所以我们需要去下载自己需要的Mysql版本安装即可。&…

立思辰打印机IP连接和USB连接

打印机是常用办公设备,很多家庭也都用着这个,立思辰3032是一个比较老的型号,属于国产打印机,基本功能都有,下边分享一下安装经验: 1.驱动: 不管是连USB还是IP地址,都需要先给电脑装上打印机驱动,只有装上驱动,系统才能够识别打印机,并帮助用户传输文件。一般来讲,立…

Jenkins动态化阶段步骤

Jenkins中如何去根据入参动态化阶段步骤呢&#xff1f; Groovy语言基础 定义一个列表变量 def list []定义一个map的kv结构变量 def map [:]如何可以动态化阶段步骤 动态化步骤&#xff1a;其实就是&#xff0c;在jenkins pipeline中根据入参或者其他变量列表&#xff0c;动…

进阶高级Python开发工程师,不得不掌握的Python高并发编程(文末送书5本)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Vue 项目路由、自定义指令、api方法自动引入资源(require.context使用)

前端项目&#xff08;当前我以Vue项目为例&#xff09;当我们把api挂载在main上后 // 将api挂载到vue的原型上 import api from /api Vue.prototype.$apiapi在src下会有一个api文件夹&#xff0c;结构如下&#xff1a; 通常情况下&#xff0c;api文件夹的index.js文件我们通常…

Morris遍历--验证二叉搜索树(java)

Morris遍历- 验证二叉搜索树题目描述Morris 遍历解题代码演示&#xff1a; morris 遍历改写后序遍历 验证二叉搜索树 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/validate-binary-search-tree 题目描述 给你一个二叉…

git同步推送代码至gitee和阿里云效

背景 已有阿里云效的代码库&#xff0c;想迁移gitee却迁移不了&#xff0c;只能把代码先拉取下来&#xff0c;然后重新建库&#xff0c;配置过后&#xff0c;采用同步推送的方式&#xff0c;同步两个库的代码。 步骤一 新建名称相同的库 在gitee上新建库 在阿里云效上新建库 …

Java 提供的队列

一、基础数据结构 1、大O 表示法 O(1)&#xff1a;常数级别&#xff0c;它执行的步数都是恒定的&#xff0c;不会因为输入变大而变大&#xff0c;哈希表的查找就是这个级别。O(N)&#xff1a;线性级别&#xff0c;随着输入变大耗费的步数也正向相关&#xff0c;遍历算法就是这…

【雕爷学编程】Arduino动手做(164)---Futaba S3003舵机模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

网络版计算器

本次我们实现一个服务器版本的简单的计算器&#xff0c;通过自己在应用层定制协议来将数据传输出去。 协议代码 此处我们为了解耦&#xff0c;采用了两个类&#xff0c;分别表示客户端的请求和服务端的响应。 Request class Request { public:Request(){}Request(int x, int…

复习单例模式

单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个…

在SpringBoot中实现文件上传

1.创建一个SpringBoot的项目&#xff0c;需要导入spring-boot-starter-web的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 2.编写文件的核心配置applica…

ASEMI二极管MURF2080CTR封装, MURF2080CTR大小

编辑-Z MURF2080CTR参数描述&#xff1a; 型号&#xff1a;MURF2080CTR 最大峰值反向电压(VRRM)&#xff1a;800V 最大RMS电压(VRMS)&#xff1a;430V 最大直流阻断电压VR(DC)&#xff1a;800V 平均整流正向电流(IF)&#xff1a;20A 非重复峰值浪涌电流(IFSM)&#xff1…

亚马逊会员日结束了,如何防止销量和排名“断崖式”下跌?

令人瞩目的2023亚马逊Prime会员日落下了帷幕&#xff0c;据官方数据显示&#xff0c;48小时售出商品超3.75亿件&#xff0c;再一次创造了历史新纪录&#xff01; 好不容易因为亚马逊会员日提升了销售额和曝光了品牌&#xff0c;那么会员日结束了&#xff0c;如何稳住您的销量和…

【网站建设】HTTP/HTTPS 是什么?有什么区别?

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff0c;感…

STM32H743 W25Q128 Keil烧录算法的制作、内存映射代码、分散加载文件源码分享

一、W25Q128烧录算法的制作 1、前言 最近做项目用到STM32H743这款芯片&#xff0c;其内部FLash有2M&#xff0c;但是项目中用到touchgfx&#xff0c;如果资源放到内部Flash中会造成两个问题&#xff0c;一是图片过多会导致内部Flash不够用&#xff0c;二是每次修改一下程序都…

一文了解近端边缘 IT 基础架构技术需求

随着边缘计算相关技术的逐渐成熟&#xff0c;边缘应用的种类也呈现多样化发展。IDC 2023 年发布的《全球边缘支出指南》归纳出 400 多种跟边缘相关的应用——这是在从 9 个地理区域、17 个技术市场、6 个技术领域和 19 个行业当中汇总出来的。 边缘计算的复杂和边缘应用的多样…