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

编程导航算法通关村第 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-1while (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-1while (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.hqwc.cn/news/26812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红队打靶:billu_b0x打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;Web渗透 第三步&#xff1a;利用文件包含进行代码审计 第四步&#xff1a;图片马上传与反弹shell 第五步&#xff1a;敏感文件提权 总结与思考 写在开头 我的博客等级终于到三级了&#xff0c;…

部署langchain+chatglm

先参考&#xff1a;window零基础部署langchain-ChatGLM_飞奔的屎壳郎的博客-CSDN博客 安装一部分&#xff0c; 1.GCC安装 gcc64位下载 一定要装64位的gcc&#xff0c;因为我的电脑是w10 64位的&#xff0c;装32位运行langchain报错并配置环境变量 可直接用压缩包中的文件&am…

Web3的2048,Sui 8192能否打开全链游戏的大门?

作者&#xff1a;Peng SUN&#xff0c;Foresight News Sui 8192&#xff1a;一局游戏就是一个NFT Sui 8192智能合约基于Move语言编写&#xff0c;构成非常简单&#xff0c;包括游戏、Game Board与排行榜&#xff08;Leaderboard&#xff09;三部分&#xff0c;覆盖方块移动、…

Leetcode每日一题(困难):834. 树中距离之和(2023.7.16 C++)

目录 834. 树中距离之和 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 834. 树中距离之和 题目描述&#xff1a; 给定一个无向、连通的树。树中有 n 个标记为 0...n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges &#xff0c; edge…

《C++程序设计原理与实践》笔记 第20章 容器和迭代器

本章和下一章将介绍STL&#xff0c;即C标准库的容器和算法部分。关键概念序列和迭代器用于将容器&#xff08;数据&#xff09;和算法&#xff08;处理&#xff09;联系在一起。 20.1 存储和处理数据 首先考虑一个简单的例子&#xff1a;Jack和Jill各自在测量车速&#xff0c…

GO语言slice

slice: data lencap 以及存取的元素是可以安全读写的 Slice 扩容。 1&#xff0c;预估&#xff1a; 2&#xff0c;预估容量后*字节数 所需的内存 3&#xff0c;各种语言从OS上提前申请内存&#xff0c;匹配GO规则的内存

Windows搭建SVN环境

VisualSVN Server下载 https://www.visualsvn.com/products VisualSVN Server安装创建仓库创建项目创建用户创建组项目分配组VisualSVN下载 https://www.visualsvn.com/products VisualSVN安装项目检出项目检出路径&#xff1a;https://changwq:8443/svn/dev/InterfaceManage 项…

如何实时记录工序流转状态——手机扫码让进度一目了然

对于生产企业来说记录工序的进展状态非常重要&#xff0c;有一部分中小型企业会使用纸制的“工序流转卡”&#xff0c;每日收集齐后再交由专员人工录入到电脑上&#xff0c;这种方式不仅费时费力&#xff0c;还容易出错&#xff0c;更重要的是无法让管理者实时掌握各个订单的进…

【FPGA】基于C5的第一个SoC工程

文章目录 前言SoC的Linux系统搭建 前言 本文是在毕业实习期间学习FPGA的SoC开发板运行全连接神经网络实例手写体的总结。 声明&#xff1a;本文仅作记录和操作指南&#xff0c;涉及到的操作会尽量细致&#xff0c;但是由于文件过大不会分享文件&#xff0c;具体软件可以自行搜…

程序环境和预处理超详细讲解

目录 程序的翻译环境和执行环境 详解编译链接 翻译环境 编译本身也分为几个阶段 运行环境 预处理&#xff08;预编译&#xff09;详解 预定义符号 #define #define 定义标识符 #define 定义宏 #define 替换规则 #和## ## 的作用 带副作用的宏参数 宏和函数对比 …

服务器反向代理

反向代理作用 隐藏服务器信息 -> 保证内网的安全&#xff0c;通常将反向代理作为公网访问地址&#xff0c;web服务器是内网&#xff0c;即通过nginx配置外网访问web服务器内网 举例 百度的网址是&#xff1a;http://www.baidu.com &#xff0c; 现在我通过自己的服务器地…

mysql 备份

mysql 备份 1. 备份的类型2.备份的类容3. 备份工具1&#xff1a;MySQL自带的备份工具2&#xff1a;文件系统备份工具3&#xff1a;其他工具 4:备份的策略1. 直接拷贝数据库文件2. mysqldump备份数据库3. mydumper备份数据库4.lvm快照从物理角度实现几乎热备的完全备份&#xff…