[数据结构] 链表

embedded/2024/12/23 22:07:55/

目录

1.链表的基本概念

2.链表的实现 -- 节点的构造和链接

        节点如何构造?

        如何将链表关联起来?

3.链表的方法(功能)

1).display() -- 链表的遍历

2).size() -- 求链表的长度

3).addFirst(int val) -- 头插法

4).addLast(int val) -- 尾插法

5).addIndex -- 在任意位置插入

6).contains(int val) -- 链表中是否包含某个元素

7). remove(int key) -- 删除第一次出现的关键字的节点

8).removeAll(int val) -- 删除所有出现的关键字的节点

9).clear() -- 清空

        回收对象,防止浪费 : head == null;



1.链表的基本概念

  • 链表(Linked List)是一种常见的基础数据结构,它由一系列节点(Node)组成,每个节点包含两部分:一部分存放数据元素,另一部分存放指向下一个节点的指针.

2.链表的实现 -- 节点的构造和链接

        节点如何构造?

在 Java 中,通常通过定义一个类来表示链表中的节点。每个节点通常包含两个部分:数据域和指针域。对于单向链表,每个节点的指针域指向下一个节点.

public class LinkedList {// 定义链表节点static class ListNode {int val; // 数据域ListNode next; // 指针域ListNode(int x) {this.val = x;this.next = null;}}public ListNode head;
}

        如何将链表关联起来?

通过访问node1的指针域next,将其赋值为下一个节点的地址,以此类推,最后让头节点head指向第一个节点node1.

        node1.next = node2;node2.next = node3;node3.next = node4;node4.next = node5;this.head = node1;

3.链表的方法(功能)

1).display() -- 链表的遍历

首先,我们创建一个名为 cur 的局部变量,它是一个指向 ListNode 类型的引用。将链表的头节点(head)赋值给 cur,这样我们就有了一个可以用来遍历整个链表的起始点.使用 while 循环来遍历链表。只要 cur不是 null(即还没有到达链表的末尾),就继续执行循环体内的代码。如果 cur 是 null,则说明已经到了链表的末尾,循环结束。在循环体内,我们使用 System.out.print 来打印当前节点的数据。这里用 + " -> " 格式化输出,以箭头分隔各个数据项,直观地表示出它们之间的链接关系。更新 cur指针,使其指向下一个节点(通过 cur.next 获取)。这一步非常重要,因为它确保了我们在下一次迭代时能够访问链表中的下一个节点。当循环结束后,我们额外打印一个 null,表示链表的终止。这是为了更清晰地展示链表结构,表明没有更多的节点了。

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

2).size() -- 求链表的长度

        定义count变量,记录cur向后走的次数,每走一步,count++

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

3).addFirst(int val) -- 头插法

        1. 将head头节点的地址传给node.next  2. 然后让head指向node

        注意: 这里两步的顺序不可以交换 , 否则 就是自己指向自己了

public void addFirst(int val) {ListNode node = new ListNode(val);node.next = head;head = node;}

4).addLast(int val) -- 尾插法

        1.为了避免head == null 报错, 先进行判断,若head == null , 则 head = node,然后return掉.

        2.若head != null , 则 这通过循环找到 cur.next == null ,最后让cur.next = node.

public void addLast(int val) {ListNode node = new ListNode(val);if(head == null) {head = node;return;}ListNode cur = head;while(cur.next != null) {cur = cur.next;}cur.next = node;}

5).addIndex -- 在任意位置插入

1.判断index的合法性: (1). 定义一个 checkIndex(int index) 方法用来检查 index 的合法性

2.index == 0 || index == size();前者相当于是头插,直接调用 addFirst(),后者相当于是尾插,直接调用 addLast()

3.找到 index 的前一个位置,创建一个 findIndexSubOne(int index) 方法,创建一个节点 cur 来接收调用方法的返回值, 最后 cur 就是 index 位置的前一个节点了

4.进行连接,实例化一个所带数据为 val 的节点 node,

node.next = cur.next;

cur.next = node;

public void addIndex(int index,int val) {// 1.判断index的合法性try {checkIndex(index);} catch(IndexNotLegalException e) {e.printStackTrace();}// index == 0 || index == size()if(index == 0) {addFirst(val);return;} else if(index == size()) {addLast(val);return;}// 3.找到index前一个位置ListNode cur = findIndexSubOne(index);// 4.进行连接ListNode node = new ListNode(val);node.next = cur.next;cur.next = node;}public ListNode findIndexSubOne(int index) {ListNode cur = head;for (int i = 0; i < index - 1; i++) {cur = cur.next;}return cur;}public void checkIndex(int index) {if(index < 0 || index >size()) {throw new IndexNotLegalException("index位置不合法");}}public class IndexNotLegalException extends RuntimeException {public IndexNotLegalException() {}public IndexNotLegalException(String message) {super(message);}}

6).contains(int val) -- 链表中是否包含某个元素

遍历链表,如果能在链表中找到val,则返回true,否则,返回false

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

7). remove(int key) -- 删除第一次出现的关键字的节点

        1.首先判断链表是否为空

        2.循环遍历 : cur.next != null

        3.找到val值的前一个节点cur : 当cur.next.val = val 时,找到目标

        4.进行删除

        

public void remove(int key) {// 如果链表为空if(head == null) {return;}// 如果第一个元素就为val时if(head.val == key) {head = head.next;return;}ListNode cur = head;while(cur.next != null) {if(cur.next.val == key) {cur.next = cur.next.next;return;}cur = cur.next;}}

8).removeAll(int val) -- 删除所有出现的关键字的节点

  • 定义两个引用变量
    • cur 代表当前需要删除的节点
    • prev 代表当前需要删除节点的前驱
  1. 若 cur.val == val
    1. prev.next = cur.next
    2. cur = cur.next
  2. 否则:
    1. prev = cur
    2. cur = cur.next
  3. 处理头节点
public void removeAll(int key) {if(head == null) {return;}ListNode prev = head;ListNode cur = head.next;while(cur != null) {if(cur.val == key) {prev.next = cur.next;cur = cur.next;} else {prev = cur;cur = cur.next;}}// 除了头节点都删除完成if(head.val == key) {head = head.next;}}

9).clear() -- 清空

        回收对象,防止浪费 : head == null;

public void clear() {this.head = null;}


http://www.ppmy.cn/embedded/147703.html

相关文章

C# 批量替换html里面的http链接

C# 批量替换html里面的http链接 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.T…

PyQt5学习笔记

P95 绝对布局 绝对布局&#xff0c;使用move方法&#xff0c;操作坐标来控件控件的位置。 import sys from PyQt5.QtWidgets import *绝对布局&#xff0c;使用move方法&#xff0c;操作坐标来控件控件的位置。class MyWin(QWidget):def __init__(self):super().__init__()#…

webgame.one 在线红白机FC游戏平台技术架构分析

前言 还记得小时候守在电视机前&#xff0c;手握红白机手柄&#xff0c;沉浸在《魂斗罗》紧张刺激的战斗、《超级马里奥兄弟》奇妙的冒险世界&#xff0c;或是与小伙伴一起在《坦克大战》里并肩作战的美好时光吗&#xff1f;那些经典的 FC 游戏&#xff0c;承载着我们童年最纯…

多线程设计模式-保护性暂停之面向对象

保护性暂停模式&#xff0c;也是多线程的一种固定模式&#xff0c;使用着这种模式时候&#xff0c;当线程在访问某个对象时&#xff0c;发现条件不满足时&#xff0c;就暂时挂起等待条件满足时再次访问。 并且能够防止虚假唤醒 那我们不禁要思考&#xff0c;在多线程终止模式…

NV12 、NV21 和 BGR转换

文章目录 前置阅读&#xff1a;YUV格式效果源码 opencv没有提供BGR转NV12或者NV21的方法&#xff0c;这里借助中间过程实现一下。 前置阅读&#xff1a;YUV格式 https://blog.csdn.net/qq_40622955/article/details/144427710 效果 原图 NV12 NV12转BGR NV21 NV21转…

Android 16 关于动态权限使用的变更

权限声明code 在 Android 中&#xff0c;权限的申请分为静态权限和动态权限。 静态权限 静态权限是指在应用的 AndroidManifest.xml 文件中声明的权限。这些权限在应用安装时就会被用户授予。常见的静态权限包括访问互联网、读取用户联系人等。 <manifest xmlns:android&…

地理信息系统(Geographic Information System,GIS)

目录 主要组成部分 主要功能 应用领域 前沿技术与发展趋势 更多学术知识 主要组成部分 数据采集&#xff1a; 通过各种手段&#xff08;如遥感、卫星影像、GPS、地面调研等&#xff09;收集地理和空间数据。这些数据可以是矢量数据&#xff08;点、线、面&#xff09;或栅…

基于时间情境创造与 AI 智能名片 S2B2C 商城小程序源码的零售创新策略研究

摘要&#xff1a;本文聚焦于零售领域的创新发展&#xff0c;深入探讨了时间情境创造在零售中的重要性&#xff0c;并结合 AI 智能名片 S2B2C 商城小程序源码这一新兴技术手段&#xff0c;阐述其如何助力零售企业突破传统模式的局限。通过对国美线上线下融合案例的剖析&#xff…