数据结构解析-链表

什么是链表

链表是由一组不必相连的内存结构,按照特定的顺序连接在一起的抽象数据类型

单链表

单链表:由各个内存结构通过一个Next追针连接在一起组成,每一个内存结构都存在后继内存结构【链尾除外】

数 据 结 构 模 型 如 下 \color{#FF00FF}{数据结构模型如下}

在这里插入图片描述

解析模型

  • Data数据 + Next指针,组成一个单链表的内存结构
  • 第一个内存结构称为链头,最后一个内存结构称为链尾
  • 链尾的Next指针设置为null「指向空指针」
  • 单链表的遍历方向单一「只从链头一直遍历到链尾」

双向链表

双向链表:由各个内存结构通过指针Next 和 指针Pre连接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构。那么内存结构又分为数据域,Pre指针域和Next指针域

数 据 结 构 模 型 如 下 \color{#FF00FF}{数据结构模型如下}
在这里插入图片描述

解析模型

  • Data 数据 + Next 指针 + Pre 指针,组成一个双向链表的内存结构;
  • 第一个内存结构称之为“链头”,最后一个称之为“链尾”
  • “链头”,“链尾”指针设置为空「NULL」
  • Prev 指向的内存结构称为 “前驱”, Next 指向的内存结构称为“后继”
  • 区分链表方向定义就是:把从链头的 Next 一直到链尾的[NULL] 遍历方向定义为正向,那么从链尾的 Prev 一直到链头 [NULL ]遍历方向就是反向;

循环列表

单向循环列表:由各个内存结构通过一个Next指针链接在一起,每一个内存结构都存在着后继内存结构,内存结构由数据域和Next指针域组成

单 向 列 表 数 据 结 构 模 型 如 下 \color{#FF00FF}{单向列表数据结构模型如下}
在这里插入图片描述
解析模型

  • 单向说白就是在单链表的基础上,把链尾的 Next 指针直接指向链头,形成一个闭环;

双向链表

双向循环链表 : 由各个内存结构通过指针 Next 和指针 Pre 链接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构,内存结构由数据域、Pre 指针域和 Next 指针域组成。

双 向 列 表 数 据 结 构 模 型 如 下 \color{#FF00FF}{双向列表数据结构模型如下}

在这里插入图片描述

解析模型

  • 双向的实现就是在双向链表的基础上,把链尾的 Next 指针指向链头,再把链头的 Pre 指针指向链尾,形成一个闭环;

注意:

循环链表没有链头和链尾的说法,因为是闭环的,所以每一个内存结构都可以充当链头和链尾;

Java ListNode 链表

定 义 链 表 初 始 化 \color{#0000FF}{定义链表初始化}

package com.j.dataStructure;

/**
 * Created by jdx on 2022/2/28 上午10:50
 */
//java类就是一种自定义的数据结构
public class ListNode<E> {
    //节点数据
    public E val;
    //对象:Java中没有指针的概念,类似于指针概念
    public ListNode<E> next;

    //添加构造方法方便初始化 ==构造方法名称和类名相同
    public ListNode(E val) {
        this.val = val;
    }
}

遍 历 链 表 \color{#0000FF}{遍历链表}

package basics;

import com.j.dataStructure.ListNode;

/**
 * Created by jdx on 2022/2/28 上午11:43
 */
public class Test {
    public static void main(String[] args) {
        //创建首节点
        ListNode nodeStart = new ListNode(0);
        //声明一个变量在移动过程中指向当前节点
        ListNode nextNode;
        //指向首节点
        nextNode = nodeStart;

        //创建链表
        for (int i = 0; i < 10; i++) {
            ListNode node = new ListNode(i);
            //连接新节点
            nextNode.next = node;
            //当前节点向后移动
            nextNode = nextNode.next;
            //循环完成之后,nextNode指向最后一个节点
            nextNode = nodeStart;
            //输出
            print(nextNode);
        }
    }

    //打印输出方法
    private static void print(ListNode nextNode) {
        //创建链表节点
        while (nextNode != null) {
            System.out.println("节点:" + nextNode.val);
            nextNode = nextNode.next;
        }
        System.out.println();
    }
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敏姐儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值