算法通关村第一关|链表基础

1. 单链表概念

对于所有的数据结构的基础都是创建+增删改查,学习链表重点也是学习链表的五种基本操作。

单向链表就像一个铁链一样,元素之间相互连接,包含多个结点,每个结点有一个指向后继元素的next指针。表中最后一个元素的next指向null。如下图:

对于单链表而言,一个结点只能有一个后继结点,但是可以多个结点指向同一个后继结点,如下图中c1被a2和b3同时指向。

在下图中c1结点有多个后继结点,则不满足链表的定义。

2. 创建链表

public class ListNode {private int data;private ListNode next;public ListNode(int data) {this.data = data;}public int getData() {return data;}public void setData(int data) {this.data = data;}public ListNode getNext() {return next;}public void setNext(ListNode next) {this.next = next;}}

如果按照Java面向对象的理论,一个类中的属性权限修饰符应该为private,这体现了封装特性,别的方法想操作类ListNode中的值,只能通过类ListNode提供的get、set方法来实现。

/*** 单链表的定义* @author jay*/
public class ListNode {public int value;public ListNode next;public ListNode(int value) {this.value = value;next = null;}
}

通常的链表定义如上所示,属性权限修饰符为public,创建对象后能直接使用ListNode.valueListNode.next来操作,虽然违背了面向对象的设计要求,但是使得该代码更为精简,在算法题中广泛应用。

3. 链表的增删改查

3.1. 遍历链表

    /*** 获取链表长度* @param head 链表头节点* @return 链表长度*/public static int getLength(ListNode head) {int length = 0;ListNode listNode = head;while (listNode != null) {length++;listNode = listNode.next;}return length;}

3.2. 链表插入

3.2.1. 表头插入

(1)创建新结点newNode

(2)将新结点newNode连接到原来链表中的头结点,newNode.next = head

(3)将头指针指向新结点newNode,head = newNode

3.2.2. 中间插入

如果我们想在值为7的结点前插入新的结点,步骤如下

(1)创建新结点newNode

(2)找到7的前一个结点停下,newNode.next = listNode(15).next(图中虚线)

(3)15结点的下个结点指向newNode,listNode(15).next = newNode

步骤(2)和(3)顺序不能颠倒,假如先执行(3),便无法在找到结点7的地址,无法将newNode的将后续结点连接起来,见下图。

3.2.3. 结尾插入

(1)创建新结点newNode

(2)newNode.next = null

(3)将新结点newNode连接到原来链表中的尾结点,listNode(40).next = newNode

3.2.4. 代码

    /*** 链表插入* @param head       链表头节点* @param nodeInsert 待插入节点* @param position   待插入位置,取值从2开始* @return 插入后得到的链表头节点*/public static ListNode insertNode(ListNode head, ListNode nodeInsert, int position) {// 需要判空,否则后面可能会有空指针异常if (head == null) {return nodeInsert;}// 越界判断int size = getLength(head);if (position > size + 1 || position < 1) {System.out.println("位置参数越界");return head;}// 在链表开头插入if (position == 1) {nodeInsert.next = head;// 将头指针指向新插入的这个结点 返回头指针head = nodeInsert;return head;}// 在链表中间插入和在链表结尾插入ListNode pNode = head;int count = 1;// 假如想插入的位置为5,那么需要找到位置4的结点并停下while (count < position - 1) {pNode = pNode.next;count++;}nodeInsert.next = pNode.next;pNode.next = nodeInsert;return head;}

3.3. 链表删除

3.3.1. 删除表头结点

只需要执行head = head.next 就行了,如上图,将head向前移动一次之后,原来的结点不可达,会被JVM回收掉。

3.3.2. 删除最后一个结点

如果删除最后一个元素40,停在最后一个元素的前一个结点,直接执行cur.next = null,此时结点40变得不可达,最终会被JVM回收掉。

3.3.3. 删除中间结点

停在要删除元素的前一个结点,直接cur.next = cur.next.next,即可。

3.3.4. 代码

    /*** 删除节点* @param head     链表头节点* @param position 删除节点位置,取值从1开始* @return 删除后的链表头节点*/public static ListNode deleteNode(ListNode head, int position) {if (head == null) {return null;}int size = getLength(head);if (position > size || position <1) {System.out.println("输入的参数有误");return head;}if (position == 1) {//curNode就是链表的新headreturn head.next;} else {ListNode cur = head;int count = 1;while (count < position - 1) {cur = cur.next;count++;}ListNode curNode = cur.next;cur.next = curNode.next;}return head;}

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

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

相关文章

【html+css】表单元素

目录 表单元素 展示图 简约写法&#xff1a; 完美写法 表单元素 输入框 单选框 复选框 下拉框 按钮 展示图 简约写法&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

【vue】a-table的斑马纹以及hover样式的修改:

文章目录 一、效果&#xff1a;二、实现&#xff08;以jeecg为例&#xff09;&#xff1a; 一、效果&#xff1a; 二、实现&#xff08;以jeecg为例&#xff09;&#xff1a; // 设置基数行样式 // .ant-table-tbody tr:nth-child(n) { // color: #fff; // }// hover时候每行…

Java研学-集合框架

一 关于集合框架 1 集合是Java提出的用来进行多个数据存储的"容器",数组也具备这样的功能, 2 由于数组一旦创建长度固定,且只能存放一种数据类型,不够灵活,Java提出更灵活,存放任意的数据类型的容器也就是集合 3 集合和数组的异同点 相同点&#xff1a;都是用来存…

毫米波雷达DOA角度计算-----DBF算法

DBF算法实现程序如下&#xff1a; 输入&#xff1a; parameter 是 毫米波雷达的参数设置。 antVec 是 目标点的8个虚拟天线的非相参积累数据。 function [angle,doa_abs] dbfMethod(parameter,antVec)txAntenna parameter.txAntenna; % 发射天线 [1 1]rxAntenna para…

抽象类的使用—模板设计模式 Java

模板设计模式 一、引入二、改进 一、引入 需求 ① 有多个类&#xff0c;完成不同的任务 job ② 要求统计得到各自完成任务的时间 ③ 请编程实现 >最容易想到的方法&#xff0c;写类&#xff0c;统计时间 AA BB中的 job 方法中是有重复的。 >改进1&#xff1a;每个类中&…

【C++】继承(下) 单继承 | 多继承 | 菱形继承 | 继承和组合

一、单/多/菱形继承 1.单继承 当一个子类只有一个直接父类时&#xff0c;称这个继承关系为单继承。 2.多继承 一个子类有两个或以上直接父类时称这个继承关系为多继承。 举个实例&#xff1a;新老师进学校工作时&#xff0c;一般会作为助教老师&#xff0c;一边代课教书&am…

Rust内存布局

题图忘了来自哪里.. 整型,浮点型,struct,vec!,enum 本文是对 Rust内存布局 的学习与记录 struct A { a: i64, b: u64,}struct B { a: i32, b: u64,}struct C { a: i64, b: u64, c: i32,}struct D { a: i32, b: u64, c: i32, d: u64,}fn main(…

达索系统3DEXPERIENCE WORKS 2024电磁仿真功能

在设计工作中&#xff0c;将复杂的模型进行网格分割是必不可少的一步&#xff0c;这样可以化繁而简&#xff0c;也可以让后续的工作更容易开展。 电磁仿真可帮助您在复杂、嘈杂的电磁环境中提高效率&#xff0c;在确保兼容性的同时&#xff0c;保障出众性能。 一系列专用求解器…

MySQL(免密登录)

简介: MySQL免密登录是一种允许用户在没有输入密码的情况下直接登录到MySQL服务器的配置。这通常是通过在登录时跳过密码验证来实现的。 1、修改MySQL的配置文件 使用vi /etc/my.cnf&#xff0c;添加到【mysqld】后面 skip-grant-tables #配置项告诉mysql跳过权限验证&#…

论文阅读:“Model-based teeth reconstruction”

文章目录 AbstractIntroductionTeeth Prior ModelData PreparationParametric Teeth Model Teeth FittingTeeth Boundary Extraction Reference Abstract 近年来&#xff0c;基于图像的人脸重建方法日趋成熟。这些方法可以捕捉整个面部或面部特定区域&#xff08;如头发、眼睛…

Go 中切片(Slice)的长度与容量

切片长度与容量在 Go 中很常见。切片长度是切片中可用元素的数量&#xff0c;而切片容量是从切片中第一个元素开始计算的底层数组中的元素数量。 Go 中的开发者经常混淆切片长度和容量&#xff0c;或者对它们不够了解。理解这两个概念对于高效处理切片的核心操作&#xff0c;比…

Linux git

1.Git 初识 不知道你⼯作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种⽂档时&#xff0c;为了防止文档丢失&#xff0c;更改失误&#xff0c;失误后能恢复到原来的版本&#xff0c;不得不复制出⼀个副本&#xff0c;⽐如&#xff1a; “报告-v1”? …