🚀链表理论:基础概念与实战技巧!

简介: 【2月更文挑战第8天】

链表理论知识

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存入下一个节点的地址。

链表的入口节点称为链表的头结点也就是head

         

链表是通过指针域的指针链接在内存中各个节点,它在内存中不是连续分布的,而是散乱分布在内存中的某个地址上。

   

     

单向链表(单链表)

链表中存入当前节点的值(数据域)和指向下一个节点的指针(指针域)

单链表相关操作

定义单链表

// 定义一个单链表
public class Node {
    private int data;//存储数据域
    private Node nextNode;//存储指向下一个的指针
    //编写构造方法
    public Node(){
    
    }
    
    
    public Node(int data){
        this.data=data;
    }
    public Node(int data,Node nextNode){
     this.data=data;
     this.nextNode=nextNode;
     
    }
     // 获取下一个节点的方法
    public Node nextNode() {
        return this.nextNode;
    }
    // 获取节点中的数据
    public int getData() {
        return this.data;
    }
    
}

单链表添加下一个节点

//在单链表中添加、插入一个节点
    public Node append(Node node){
        //获得当前节点
        Node currentNode=this;
        //循环往后找,直到该节点为空
        while (true){
            //获得下一个节点
            Node nextNode=currentNode.nextNode;
            // 如果下一个节点为 Null, 当前节点已经是最后一个节点
            if (nextNode==null){
                break;
            }
            
            //赋值给当前节点
            currentNode=nextNode;
        }
        
        //把添加的节点追加到当前的节点上
        currentNode.nextNode=node;
        return this;
    }

单链表中插入一个节点

//插入节点
    public void after(Node node){
        //取出下一节点,用作下下节点
        Node newNode=this.nextNode;
        //把插入节点作为下一节点
        this.nextNode=node;
        //把下下节点作为插入节点的下一个节点
        node.nextNode=newNode;
    }

单链表中删除下一节点

删除操作主要就是将当前节点的指针指向下下一个节点。

//删除下一节点
    public void remove(){
        //取出下下一节点
        Node newNode= this.nextNode.nextNode;
        //把下下一个节点设置为当前节点的下一个节点
        this.nextNode=newNode;
    }

遍历单链表

//遍历链表
    public void showList(){
        //当前链表
        Node currentNode=this;
        
        while (true){
            System.out.println(currentNode.data+",");
            //取出下一节点
            Node nextNode=currentNode.nextNode;
            
            //如果为空,跳出循环
            if (nextNode==null){
                System.out.println();
                break;
            }
        }
    }

双向链表(双链表)

当前节点的值(数据域)(指针域) 一个指向前一个节点的指针,一个指向后一个节点的指针。

双链表相关操作

定义双链表

public class DoubleNode {
    
    //上一个节点
    private DoubleNode preNode;
    private int data;
    //下一个节点
    private DoubleNode nextNode;
    
    public DoubleNode(int data){
        this.data=data;
    }
    public DoubleNode getPreNode() {
        return preNode;
    }
    public int getData() {
        return data;
    }
    public DoubleNode getNextNode() {
        return nextNode;
    }
}

双链表增加新节点

//增加节点
    public void add(DoubleNode node){
        //当前节点
        DoubleNode currentNode=this;
        //当前节点的下一个节点
        DoubleNode newNode=this.nextNode;
        //新节点作为当前节点的下一个节点
        this.nextNode=node;
        node.preNode=currentNode;
        // 原来的下一个节点作为新节点的下一个节点
        node.nextNode=newNode;
        // 让原来的下一个节点的上一个节点为当前新节点
        newNode.preNode=node;
        
    }

双链表插入一节点

//插入一节点
    public void insert(DoubleNode node){
        DoubleNode currentNode=this;
        //取出下一节点,用作下下节点
        DoubleNode newNode=this.nextNode;
        //把插入节点作为下一节点
        currentNode.nextNode=node;
        node.preNode=currentNode;
        //把下下节点作为插入节点的下一个节点
        node.nextNode=newNode;
        newNode.preNode=node;
    }

双链表删除一节点

//删除一节点
    public void delete(){
        //获取当前节点
        DoubleNode currentNode=this;
        // 取出下下一个节点
        DoubleNode newNode=this.nextNode.nextNode;
        // 把下下一个节点设置为当前节点的下一个节点
        currentNode.nextNode=newNode;
        newNode.preNode=currentNode;
    }

循环单链表

循环链表,链表首尾相连,用于解决约瑟夫环问题。

循环单链表相关操作

定义循环单链表

public class forList {
    private int data;
    private forList nextNode;
    public forList(int data){
        this.data=data;
    }
    public int getData() {
        return data;
    }
    public forList getNextNode() {
        return nextNode;
    }
}

循环单链表中插入一节点

public void insert(forList node){
        forList currentNode=this;
        //取出下一节点,用作下下节点
        forList nextNode=this.nextNode;
        //把插入节点作为下一节点
        currentNode.nextNode=node;
        //把下下节点作为插入节点的下一个节点
        node.nextNode=nextNode;
    }

循环单链表中删除一节点

//删除某一节点
    public void delete(){
        // 取出下下一个节点
        forList newNode=this.nextNode.nextNode;
        // 把下下一个节点设置为当前节点的下一个节点
        this.nextNode=newNode;
    }

遍历循环单链表

//遍历所有节点
    public void showAllNode(){
        forList currentNode=this;
        
        while (true){
            System.out.println("当前节点:"+currentNode.data);
            
            if (currentNode.nextNode==null){
                System.out.println("已经为最后一个节点");
                break;
            }
            
        }
    }

数组与链表性能比较

数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。

链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

目录
相关文章
|
7月前
|
存储 缓存 算法
链表全景:探索单链表、双向链表与循环链表【实战演练】
链表全景:探索单链表、双向链表与循环链表【实战演练】
87 3
|
3月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
4月前
|
存储 算法
链表经典操作与实战
文章深入探讨了链表的基本概念、分类和经典操作,通过LeetCode上的实战题目展示了如何应用虚拟头节点、双指针法、定位前驱节点等技巧来解决链表相关问题,并强调了算法在软件开发中的重要性。
链表经典操作与实战
|
5月前
|
存储 数据管理 C语言
C语言实战 | 使用链表完成“贪吃蛇”游戏
【7月更文挑战第1天】整体思维,即系统思维,强调以整体视角理解事物。在编程中,结构体体现这种思想,将相关变量打包处理。示例展示了如何用链表而非数组实现“贪吃蛇”游戏,链表提供了更灵活的动态数据管理。一系列代码图片详细描绘了链表结构体在游戏中的应用,包括节点定义、移动、碰撞检测等,凸显了使用链表的优势和代码的清晰组织。
58 0
C语言实战 | 使用链表完成“贪吃蛇”游戏
|
6月前
|
存储 算法 C语言
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
|
6月前
|
存储 算法 Linux
【内核链表】数据结构——深入理解内核链表的概念和操作&笔记
【内核链表】数据结构——深入理解内核链表的概念和操作&笔记
|
7月前
|
存储 算法 索引
数据结构与算法④(第二章下)链表概念+单链表的实现
数据结构与算法④(第二章下)链表概念+单链表的实现
44 0
|
7月前
|
算法 Java
快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战
快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战
123 0
|
机器学习/深度学习 存储
链表oj题 && 链表与LinkedList && 栈的概念 && 队列的概念 && 树和二叉树
链表oj题 && 链表与LinkedList && 栈的概念 && 队列的概念 && 树和二叉树
159 38
|
7月前
|
存储 JavaScript 算法
TypeScript算法专题 - [双链表1] - 双链的概念及其实现
TypeScript算法专题 - [双链表1] - 双链的概念及其实现
52 0