首页 > 其他分享 >链表知识点

链表知识点

时间:2023-03-21 20:57:20浏览次数:28  
标签:知识点 结点 ListNode val next 链表 指针

链表知识点总结

链表简介

链表:是由一种一个或多个指针域和数据域组成的特殊数据结构

img

链表类型

单链表

单链表中的指针域指向下一个节点

链表1

双链表

双链表中有两个指针域,一个指向前一个节点,还有一个指向后一个节点

链表2

循环链表

循环链表结构如字面上的意思,链表首尾相接

链表4

链表存取方式

链表和数组不同,数组在内存中的存储方式是连续的,链表在内存中的存储方式是不连续的,链表通过指针就可以找到链表的其它节点,因此,链表在删除方面较数组有更大的优势和进步

链表重要概念

首元结点

就是链表中存储第一个数据元素的结点

头结点

它是在首元节点之前附设的一个结点,其指针域指向首元节点。头结点的数据域可以不存储任何信息,也可以存储与数据元素类型的其他附加信息

头指针

它是指向链表中的第一个结点的指针。若链表设有头结点,则头指针所指结点为线性表的头结点,若链表不设头结点,则头指针所指结点为该链表的首元节点

img

设有头结点:

img

不设置头结点:

img

优点

  • 增加了头结点后,首元节点的地址保存在头结点的指针域中,则对于链表的第一个元素的操作就与其他元素相同,不需要进行特殊处理
  • 便于空表的和非空表的统一处理;当链表不设头结点时,假设L为单链表的头指针,它应该指向首元节点,则当单链表为长度n为0的空表时,L指针为空 (判断空表的条件可记为: L == NULL)

链表的定义

首先,来定义一个简单的单链表

// 单链表
struct ListNode {
    int val; // 数据域
    ListNode *next; // 指针域
    ListNode(int x) : val(x), next(NULL) {} //结点构造函数 可以定义也可以不定义
}

如果没有定义构造函数,那么使用默认的构造函数初始化的时候就不能够赋值

ListNode* head = new ListNode(1);
----
ListNode* _head = new ListNode();
_head->val = 1;

链表的操作

删除结点

删除给出的结点

链表-删除节点

只需要通过修改C结点的指针域就可以删除掉D结点,因为在C/C++中没有内存回收机制,所以需要自己手动释放内存,在Python,Java中不需要这样的操作。

代码操作

struct ListNode {
    int val;
    ListNode *next; 
    ListNode(int x) : val(x), next(NULL){} //构造函数
}
/*
给一个链表 
head = [1, 2, 3, 4, 5]
val = 4
*/
// 定义一个头结点
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead; // 头指针
// 删除结点
while (cur->next != NULL){
    if (cur->next->val == val) {
        ListNode* tmp = cur->next;
        cur->next = cur->next->next;
        delete tmp;
    } else {
        cur = cur->next;
    }
}
head = dummyHead->next;
delete dummyHead;
return head;

添加结点

在原有基础上添加一个结点

链表-添加节点

链表在删除和添加上面有天生的优势,可以看到在删除和添加上都只是O(1)的操作,也不影响其他结点

链表和数组的比较

插入/删除(时间复杂度) 查询(时间复杂度) 适用场景
数组 O(n) O(1) 数据量固定,查询较多,较少增删
链表 O(1) O(n) 数据量不固定,增删较多,较少查询

标签:知识点,结点,ListNode,val,next,链表,指针
From: https://www.cnblogs.com/luketebo/p/17241366.html

相关文章

  • 数据结构-->带头双向循环链表--->优化
    好了,各位老铁!!现在开始本期讨论话题:<--头删数据----头插数据-->直接上手代码:头文件“List.h”#include<stdio.h>#inculde<stdlib.h>//扩容函数malloc库#include<asse......
  • algrothm_reverse(algrothm+round)【反转链表】
    ......
  • 数据结构-->带头双向循环链表
    好了,小伙伴们!!本期我们开始“带头双向循环链表”!!很显然,这一次要涉及哨兵位了!!而在这之前,单向链表当中没有丝毫提及“哨兵位”的概念!!其实,这是因为,带哨兵位的单向链表在实际开发......
  • JS 知识点收集
    js文件中import中加{}和不加{}的区别参考网址https://blog.csdn.net/baidu_38225647/article/details/104968662大括号的加与不加取决于import来源的js文件-如果......
  • 合并链表-leetcode23-合并k个升序链表
    给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6......
  • 网络知识点汇总2-MPLS
    1.协议地图   2.MPLS介绍 ATM的优缺点:ATM转发采用唯一匹配,一次查表,效率很高ATM控制信令复杂,成本高昂,难以普及 ATM技术虽然没有成功,但其中有几点创新:摒弃......
  • Java基础知识点(方法的重写)
    一定义:当父类的的方法不能满足子类现在的需求时,需要进行方法重新。 在我看来方法的重写就是父类的方法中的行为不能表达出子类的特征,而子类还需要进行行为而对父类的方法......
  • Java基础知识点(继承中构造方法的的访问特点
    一:概述​1.父类的构造方法不会被子类继承。2.子类中的构造方法默认先访问父类中的无参构造,在执行自己。换句话来说,子类不能得到父类的的构造方法,子类进行构造方法默认先访问......
  • N03、从尾到头打印链表(挺简单的)
    ​​3、从尾到头打印链表​​输入一个链表,按链表从尾到头的顺序返回一个ArrayList。示例1输入{67,0,24,58}返回值[58,24,0,67]1、这题也太简单了,从前向后保存,然后reverse......
  • golang面试题单向链表和双向链表
    甲流难受中,简单发一个链表 1.单项列表packagemainimport( "fmt" "strconv")typeNodestruct{ valueint next*Node}typeLinkliststruct{ leni......