数据结构与算法 数组和链表

简介: 数据结构与算法 数组和链表

数组

python 数组都是动态数组,长度是自动变化的,所以不需要数组的扩容操作,这也是python运行要比C,Java慢的原因之一

列表: 由于数组长度不可变导致实用性降低,创建了一种动态数组的数据结构,称为列表

所以严格意义来说,python里面的数组就是列表

列表的代码(硬要定义数组不可变化)

class MyList:
    def __init__(self):
        self.__capacity = 10
        self.__nums = [0] * self.__capacity
        self.__size = 0
        self.__extend_ratio: 2
    def size(self):
        return self.__size
    
    def capacity(self):
        return self.__capacity
    
    def get(self, index):
        if index < 0 or index > self.__size:
            raise IndexError('索引越界')
        return self.__nums[index]
        
    def set(self, index, val):
        if index < 0 or index > self.__size:
            raise IndexError('索引越界')
        self.__nums[index] = val
    
    def add(self, val):
        if self.__size == self.__capacity:
            self.__capacity *= self.__extend_ratio
        self.__nums[self.__size] = val
        self.__size += 1
    def insert(self, index, val):
        if index < 0 or index > self.__size:
            raise IndexError('索引越界')
        for i in range(index, self.__size-1):
            self.__nums[i+1] = self.__nums[i]
        
        self.__nums[i] = val
        self.__size += 1
    def remove(self, index):
        if index < 0 or index > self.__size:
            raise IndexError('索引越界')
        
        for i in range(index, self.__size-1):
            self.__nums[i] = self.__nums[i+1]
        
        self.__size -= 1
    
    def extend_capacity(self):
        self.__nums += [0]*self.__capacity*(self.__extend_ratio - 1)
        self.__capacity = len(self.__nums)

链表

链表的代码:

class ListNode:
  def __init__(self, value):
  self.value = value
  self.next = None
  self.prev = None

对比

重点

  • 数组和链表是两种基本的数据结构,分别代表数据在计算机内存中的两种存储方式:连续空间存储和离散空间存储。两者的特点呈现出互补的特性。
  • 数组支持随机访问、占用内存较少;但插入和删除元素效率低,且初始化后长度不可变。
  • 链表通过更改引用(指针)实现高效的节点插入与删除,且可以灵活调整长度;但节点访问效率低、占用内存较多。常见的链表类型包括单向链表、循环链表、双向链表。
  • 动态数组,又称列表,是基于数组实现的一种数据结构。它保留了数组的优势,同时可以灵活调整长度。列表的出现极大地提高了数组的易用性,但可能导致部分内存空间浪费。


目录
相关文章
|
12天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
39 4
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
27 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
13天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
13天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
16 0
数据结构与算法学习五:双链表的增、删、改、查
|
12天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
29 0
|
26天前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
18 0
|
1月前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表
|
1月前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用
|
1月前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
18 0