首页 > 其他分享 >十天学完基础数据结构-第四天(链表(Linked List))

十天学完基础数据结构-第四天(链表(Linked List))

时间:2023-10-17 21:32:42浏览次数:45  
标签:单链 删除 List 链表 双链 学完 节点 指针

十天学完基础数据结构-第四天(链表(Linked List))_数据结构

链表的基本概念

链表是一种线性数据结构,与数组不同,链表的元素(节点)之间通过指针相互连接。链表有以下基本概念:

  • 节点:链表中的每个数据项称为节点,每个节点包含数据和一个指向下一个节点的指针。
  • 头节点:链表的第一个节点称为头节点,它通常用来表示整个链表的起始位置。
  • 尾节点:链表的最后一个节点称为尾节点,它的指针通常指向空值(null)。

单链表和双链表的区别

链表可以分为单链表双链表两种主要类型。

  • 单链表:每个节点只包含指向下一个节点的指针。单链表具有较小的内存开销,但不能轻松地反向遍历。
  • 双链表:每个节点包含指向下一个节点和上一个节点的指针。双链表允许双向遍历,但内存开销较大。

链表的常见操作

链表支持以下常见操作:

  1. 插入节点:在链表中插入一个新节点,通常需要更新相邻节点的指针。
  2. 删除节点:从链表中删除一个节点,通常需要更新相邻节点的指针。
  3. 反转链表:将链表中的节点顺序颠倒。
  4. 获取链表长度:获取链表中节点的数量。

下面是一个简单的C++示例,创建一个单链表,插入和删除节点,以及获取链表长度:

#include <iostream>

// 链表节点定义
struct Node {
    int data;     // 节点数据
    Node* next;   // 指向下一个节点的指针
};

int main() {
    // 创建链表头节点
    Node* head = nullptr;
    
    // 插入节点
    Node* newNode1 = new Node;
    newNode1->data = 1;
    newNode1->next = nullptr;
    head = newNode1;

    Node* newNode2 = new Node;
    newNode2->data = 2;
    newNode2->next = nullptr;
    newNode1->next = newNode2;

    // 删除节点
    delete newNode1;
    head = newNode2;

    // 获取链表长度
    int length = 0;
    Node* current = head;
    while (current != nullptr) {
        length++;
        current = current->next;
    }

    std::cout << "链表长度:" << length << std::endl;

    return 0;
}

练习题:

  1. 单链表和双链表有什么主要区别?在什么情况下你会选择使用单链表或双链表?
  2. 描述一种情况,其中链表比数组更适合存储和管理数据。
  3. 如何在链表中插入一个新节点?这个操作的时间复杂度是多少?
  4. 如何删除链表中的一个节点?这个操作的时间复杂度是多少?

单链表和双链表有什么主要区别?在什么情况下你会选择使用单链表或双链表?

  • 单链表:单链表中的每个节点只包含一个指针,通常是指向下一个节点的指针。这种结构内存开销较小,但只能单向遍历。单链表适合在内存开销有限的情况下,需要单向访问数据的场景。
  • 双链表:双链表中的每个节点包含两个指针,一个指向下一个节点,另一个指向前一个节点。这允许双向遍历,但内存开销较大。双链表适用于需要双向遍历或频繁在链表中间插入和删除节点的情况。

选择使用单链表或双链表取决于需求。如果只需要单向访问或内存受限,单链表可能更合适。如果需要双向遍历或频繁插入和删除节点,双链表可能更合适。

描述一种情况,其中链表比数组更适合存储和管理数据。

链表比数组更适合以下情况:

  • 动态大小:当数据集的大小在运行时不断变化时,链表更适合,因为它可以动态分配和释放内存,而数组的大小通常是固定的。
  • 频繁插入和删除:如果需要频繁插入和删除数据项,链表比数组更高效,因为插入和删除操作的时间复杂度为O(1),而数组中的相同操作通常需要O(n)。
  • 没有随机访问需求:如果只需要按顺序访问数据而不需要随机访问(使用索引),链表是一个不错的选择。

如何在链表中插入一个新节点?这个操作的时间复杂度是多少?

插入新节点的步骤如下:

  • 创建一个新节点,设置其数据和指针。
  • 更新新节点的指针,使其指向原链表中适当位置的节点。
  • 更新原链表中相邻节点的指针,使其指向新节点。

这个操作的时间复杂度取决于插入位置。如果插入位置是已知的,时间复杂度是O(1),因为只需修改指针。如果需要在链表中间插入,并且需要遍历找到插入位置,时间复杂度是O(n),其中n是链表的长度。

如何删除链表中的一个节点?这个操作的时间复杂度是多少?

删除链表中的节点的步骤如下:

  • 找到要删除的节点。
  • 更新相邻节点的指针,将其跳过要删除的节点。
  • 释放要删除的节点的内存。

这个操作的时间复杂度取决于查找要删除的节点的时间。如果删除位置是已知的,时间复杂度是O(1),因为只需修改指针。如果需要遍历链表来查找要删除的节点,时间复杂度是O(n),其中n是链表的长度。

注意,在删除节点之前,始终要确保释放节点的内存,以避免内存泄漏。

标签:单链,删除,List,链表,双链,学完,节点,指针
From: https://blog.51cto.com/u_15747017/7909674

相关文章

  • 代码随想训练营第四天(Python)| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点
    两两交换链表中的节点关键点:涉及到头节点变动的都使用虚拟节点。画图找出交换节点指向的顺序和退出循环的条件。1、迭代法classSolution:defswapPairs(self,head:Optional[ListNode])->Optional[ListNode]:dummy_node=ListNode(next=head)cur=......
  • Day3 链表的一些基本练习
    Day3链表的基础练习最基本的删除节点Lc203我习惯的还是弄一个新的dummyhead,然后如果是要找的节点,就删除,删除完记得delete。//代码没什么好看的,主要就是熟悉链表的写法classSolution{public:ListNode*removeElements(ListNode*head,intval){ListNode......
  • Leetcode206. 反转链表
    题目描述给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例提交的代码classSolution{publicListNoderesultHead;publicListNodereverseList(ListNodehead){if(head==null)returnnull;ListNodefirst=recursionOfList(he......
  • 搭建局域网网盘alist
    搭建局域网网盘在下面alist网址进入,下载window环境。alist网址window环境下载地址下载这个alist-windows-amd64.zip#解压下载的文件,得到可执行文件:unzipalist-xxxx.zip#运行程序.\alist.exeserver#获得管理员信息以下两个不同版本,新版本也有随机生成和手动设置#......
  • java链表详解 理论+代码+图示
    1、定义链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。(即链表是一个个节点组成的,这些节点物理上不连续,但逻辑上连续)一个节点就是一个Node对象。2、链表结构单向、双向;带头、不带头;循环、非循环; 以上情况组......
  • 使用Guava的ListenableFuture完成异步多线程任务并返回结果
    privatestaticExecutorServiceexecutors=newThreadPoolExecutor(5,20,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<Runnable>(10),newThreadFactoryBuilder().setNameFormat("抓数据线程-%d").build());publicstaticvoidmain(String[]arg......
  • WPF控件ItemsControl、ListBox、ListView、DataGrid、TreeView、TabControl用法及区别
    1.ItemsControltemsControl是WPF中最基本的控件之一,用于显示一个数据项集合。它允许按照自定义方式呈现任何类型的对象,可以在其中使用不同的布局和面板来展示数据。ItemsControl非常灵活,可以满足各种需求。以下是一个简单的ItemsControl的XAML示例,它使用StackPanel作为布局容器,......
  • Leetcode707. 设计链表
    题目描述你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果是双向链表,则还需要属性prev以指示链表中的上一个节点。假设链表中的所有节点下标从0开始。实现M......
  • 代码随想训练营第三天(Python) | 203.移除链表元素、707.设计链表、206.反转链表
    一、203.移除链表元素关键点:如何删除节点,需要知道删除节点前的节点。1、无虚拟头节点的方法classSolution:defremoveElements(self,head:Optional[ListNode],val:int)->Optional[ListNode]:whilehead!=Noneandhead.val==val:#如果头节点的值......
  • Leetcode203.移除链表元素
    题目描述给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例提交的代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......