数据结构与算法之链表

1、概述

链表就是通过指针将一个个节点连接起来。链表是非连续的动态内存空间,链表的查找比数组慢,但是添加和删除比数组快。在链表中分为他的种类分为单链表、双向链表、循环链表三种。

2、单链表

它是由一组节点组合而成的集合, 每个节点都使用一个对象的引用指向它的后继。 指向另一个节点的引用叫做链。那么我们通过下面的图来做详细分析,

根据上面链表结构发现:

每个结点除了存储数据data外,还需要记录下个结点的地址,称为后继指针next。

单链表有两个特殊的结点,分别是第一个结点——头结点和最后一个结点——尾结点。

头结点:用来记录链表的基地址。

尾结点:尾结点的后继指针指向一个空地址NULL。

3、双向链表

双向链表和单向链表的区别就是每一个元素是双向的,一个元素中包含两个引用:一个指向前一个元素;一个指向下一个元素。除此之外,双向链表还有一个指向最后一个元素的tail指针,这使得双向链表可以从头尾两个方向迭代链表,他的结构如下所示:

每个结点除了存储数据data外,还会会记录上一个结点和下一个结点的地址。

单链表和双向链表的区别

单链表的结点只有一个指向,即后继指针next指向下一个结点。

双向链表的结点有两个指向,一个后继指针next指向下一个结点,还有一个前驱指针prev指向上一个结点。

4、循环链表

循环链表的尾结点不指向空,而是指向头结点,类似一个环形结构。如下结果图所示:

 5、链表的特性

(1)链表的内存空间都是零散的,所以它不支持随机访问

(2)插入或删除数据不需要移动数据,在这方面的效力还是比较高的

(3)因为链表的每个内存块都不是连续的,所以不需要提前计算内存的大小,内存空间可以根据结点数量的改变而改变。

6、顺序表与链表的对比

顺序表和链表都属于线性表,那么他们之间还是存在一定差异性,如下分析:

 以上就是对链表的一个基本了解,下面对链表常用的一些操作举列

链表声明:

public class ListNode {
    int val;
    ListNode next;
    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

链表的添加:

public void insertList(ListNode head, int val) {
    ListNode tempNode = new ListNode(val);
    if (head == null) {
        head = tempNode;
    }else {
        ListNode p = head;
        while (p.next != null) {
            p = p.next;
        }
        p.next = tempNode;
    }
}

链表的删除:

public void deleteListNode(ListNode head, int val) {
    if (head ==null) return;//为了鲁棒性
    if (head.val == val) {//头节点为要删除节点
        head = head.next;
    } else {
        ListNode p = head;
        //删除节点需要知道前一个节点,所以判断p.next.val是不是和目标相等
        while (p.next !=null && p.next.val != val) {
            p = p.next;
        }
        if (p.next !=null) {
            p.next = p.next.next;//删除节点
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值