算法通关村第一关 | 链表青铜笔记

一、单链表的定义

链表(linked list)是一种在物理上非连续、非顺序的数据结构,由 若干节点(node)所组成。

单向列表得每一个节点包含俩部分:一是存放数据的变量data,二是指向下一个节点的指针next

注意:链表中的最后一个元素的next指向 NULL。

辨析概念:

思考下面俩个图是否为单链表?

图一:

图二:

图一是满足单链表要求,因为单链表要环环相扣,且核心是一个节点只能有一个后继,但是并不代表一个节点只能有一个被指向(即一个节点只能指向一个下级节点,但是这个节点可以被多个上级节点所指向)

图二是不满足单链表要求的,因为c1有俩个后继(c1指向俩个下级节点)

链表其他概念:

节点和头节点:

在链表中,每个点都由值和指向下一个结点的地址组成的独立的单元,称为一个节点,也称为节点。

链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。

对于单链表,如果知道了第一个元素,就可以通过遍历访问整个链表
因此第一个结点最重要,一般称为头结点。

虚拟节点:

在做题以及在工程里经常会看到虚拟结点的概念,其实就是一个结点dummyNode,其next指针指向head,也就是dummyNode.next=head.

因此,如果我们在算法里使用了虚拟结点,则要注意如果要获得head结点,或者从方法(函数)里返回的时候,则应使用dummyNode.next。

另外注意,dummyNode的val不会被使用,初始化为0或者-1等都是可以的。既然值不会使用,那虚拟结点有啥用呢?简单来说,就是为了方便我们处理首部结点,否则我们需要在代码里单独处理首部结点的问题。在链表反转里,我们会看到该方式可以大大降低解题难度。

如何构建单链表:

理解Java是如何构造出链表的

Java中的JVM有栈区堆区

栈区:主要存放的是引用,指向对象实例的地址

堆区:存放创建的对象

public class ListNode {
    //值(data)
    int val;

    //指向 ListNode的下一个对象(即下一节点的引用)
    ListNode next;
}

下图所示:在 JVM中如何构建链表

 上图通过栈的引用(地址)可以找到val(1),因为val(1)节点存放了指向val(2)的地址,而val(3)又存放了指向val(4)的地址,所以就可以构造出一个链表结构。

二、Java链表的增删改查

2.1遍历链表

单链表遍历:从头往后逐个访问,所以进行操作之后能否找到表头最为重要

    public static int getListLength(Node head) {
        int length = 0;
        Node node = head;
        while (node != null) {
            length++;
            node = node.next;
        }
        return length;
    }

2.3链表的插入

链表插入分为:尾部插入、头部插入、中间插入

尾部插入:把最后一个节点的next指针指向新插 入的节点即可

头部插入:

                第一步:创建一个新节点newNode,把新节点(newNode)的next指向原先的头节点

                第二部:把新节点(newNode)变为链表的头节点

中间插入:

                第一步:新节点的next指针,指向插入位置的节点

                第二步:插入位置前置节点的next指针,指向新节点。

如下图:要在15的前面插入,当cur.next = node(15)时就应该停下,此时 cur.val = 65,然后需要给newNode前后接两根线,此时只能先让 newNode.next = node(65).next (图中的虚线),然后

node(65).next = newNode,而且顺序不能错。

不要颠倒顺序,如果颠倒顺序,new出来的节点的next指向的就是自己了,就与node(15)断开咯

2.3链表的删除

链表删除分为:尾部删除、头部删除、中间删除

尾部删除:把倒数第2个节点的next指针指向空 即可

头部删除:把链表的头节点设为原先头节点的next指针 即可

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

中间删除:把要删除节点的前置节点的next指针,指 向要删除元素的下一个节点即可

删除中间节点时,也会要用 cur.next来比较,找到位置后,将cur.next 指针的值更新为cur.next.next即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值