python 数据结构之:链表

python 数据结构之:链表

1 内存概念

  • 计算机的作用:用来存储和运算二进制的数据
  • 问题:计算机如何计算1+2?
    • 将1和2的二进制类型的数据加载到计算机的内存中,然后使用寄存器进行数值的运算。
  • 变量的概念
    • 变量就是某一块内存,如引用变更:a=1时:
      • a=1,表示a变量引用了数值为1的内存空间地址
      • 指向:如果变量所引用的对象,表示的是某一块内存空间地址的话,则该变量指向了该块内存
  • 内存空间是有两个默认的属性:
    • 内存空间的大小:一个十六进制内存地址可以存储8个数据位(bit)
      • bit(位):一个bit大小的内存空间只能存放一位二进制的数
      • byte(字节):1byte=8bit
      • kb:1024byte
    • 内存空间的地址
      • 使用一个十六进制的数值表示
      • 作用:让CPU寻址
  • 内存大小与地址之间的关系:
    • 假如RAM的地址范围从0x2000 0000到0x2000 2000,也就是有2000个内存地址,1个内存地址是可以存8位二进制数,如何来算这空间的容量是多少字节呢?
      • 先用0x2000 2000 -0x2000 0000=2000,得到的2000是十六进制数
      • 然后把十六进制的2000换算成十进制,等于8192,那就是8192个字节,再数以1024等于8KB。
  • 不同数据占用内存空间的大小不同

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()
posted @ 2023-07-08 10:23  f_carey  阅读(19)  评论(0编辑  收藏  举报