python 数据结构之:链表
python 数据结构之:链表
1 内存概念
- 计算机的作用:用来存储和运算二进制的数据
- 问题:计算机如何计算1+2?
- 将1和2的二进制类型的数据加载到计算机的内存中,然后使用寄存器进行数值的运算。
- 变量的概念
- 变量就是某一块内存,如引用变更:
a=1
时:a=1
,表示a变量引用了数值为1的内存空间地址- 指向:如果变量所引用的对象,表示的是某一块内存空间地址的话,则该变量指向了该块内存
- 变量就是某一块内存,如引用变更:
- 内存空间是有两个默认的属性:
- 内存空间的大小:一个十六进制内存地址可以存储8个数据位(bit)
- bit(位):一个bit大小的内存空间只能存放一位二进制的数
- byte(字节):
1byte=8bit
- kb:1024byte
- 内存空间的地址
- 使用一个十六进制的数值表示
- 作用:让CPU寻址
- 内存空间的大小:一个十六进制内存地址可以存储8个数据位(bit)
- 内存大小与地址之间的关系:
- 假如RAM的地址范围从0x2000 0000到0x2000 2000,也就是有2000个内存地址,1个内存地址是可以存8位二进制数,如何来算这空间的容量是多少字节呢?
- 先用0x2000 2000 -0x2000 0000=2000,得到的2000是十六进制数
- 然后把十六进制的2000换算成十进制,等于8192,那就是8192个字节,再数以1024等于8KB。
- 假如RAM的地址范围从0x2000 0000到0x2000 2000,也就是有2000个内存地址,1个内存地址是可以存8位二进制数,如何来算这空间的容量是多少字节呢?
- 不同数据占用内存空间的大小不同
2 顺序表
-
集合中存储的元素是有顺序的,顺序表的结构可以分为两种形式:单数据类型和多数据类型。
-
python中的列表和元组就属于多数据类型的顺序表
-
多数据类型顺序表的内存非连续开辟
-
-
顺序表的弊端:
- 顺序表的结构需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁。
3 链表
- 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是每一个结点(数据存储单元)里存放下一个结点的信息(即地址)
- 相对于顺序表,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理且进行扩充时不需要进行数据搬迁。
is_empty()
:链表是否为空length()
:链表长度travel()
:遍历整个链表add(item)
:链表头部添加元素append(item)
:链表尾部添加元素insert(pos, item)
:指定位置添加元素remove(item)
:删除节点search(item)
:查找节点是否存在
class Node(object):
def __init__(self, item):
self.item = item
self.next = None
class Link(object):
def __init__(self):
# 构造出一个空链表
# _head存储的只能是空或者第一个节点的地址
self._head = None
def isempty(self):
return self._head is None
def length(self):
cur = self._head
count = 0
while cur:
count += 1
cur = cur.next
return count
# 向链表的头部插入一个节点
def add(self, item):
# 创建一个新的节点
node = Node(item)
node.next = self._head
self._head = node
def travel(self):
cur = self._head
while cur:
print(cur.item)
cur = cur.next
def append(self, item):
node = Node(item)
if self._head is None:
self._head = node
return
cur = self._head
pre = None
while cur:
pre = cur
cur = cur.next
pre.next = node
def insert(self, pos, item):
node = Node(item)
cur = self._head
pre = None
for i in range(pos):
pre = cur
cur = cur.next
pre.next = node
node.next = cur
def remove(self, item):
cur = self._head
if cur.item == item:
self._head = cur.next
return
while cur:
pre = cur
cur = cur.next
if cur.item == item:
pre.next = cur.next
return
if cur.next is None:
return
if __name__ == '__main__':
link = Link()
link.append(1)
link.add(2)
link.append(3)
link.append(4)
link.append(5)
link.insert(2,1.3)
link.remove(5)
link.travel()
link.isempty()
link.length()
4 排序链表
class Node(object):
def __init__(self, item):
self.item = item
self.next = None
class SortLink(object):
def __init__(self):
self._head = None
def add(self, item):
node = Node(item)
if self._head is None:
self._head = node
return
cur = self._head
if cur.item > item:
self._head = node
node.next = cur
return
while cur:
cur_next = cur.next
if cur_next is None:
cur.next = node
return
if cur_next.item > item:
cur.next = node
node.next = cur_next
return
cur = cur.next
def travel(self):
cur = self._head
while cur:
print(cur.item)
cur = cur.next
if __name__ == '__main__':
sl = SortLink()
sl.add(1)
sl.add(3)
sl.add(2)
sl.travel()
alist = [5, 7, 23, 9, 54, 2]
for a in alist:
sl.add(a)
sl.travel()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)