数据结构与算法-顺序表和链表

内存

  • 计算机的作用
    • 用来存储和运算二进制的数据
import numpy as np
np.iinfo('int8')

iinfo(min=-128, max=127, dtype=int8)
  • 变量的概念
    • 就是表示计算机中的某一块内存。
    • a = 10
    • 计算机的某一块内存空间会有两个原始的属性
      • 大小:决定该块内存最大存储多大的数值
      • 地址:16进制的数表示。作用就是可以根据16进制的地址在整个计算机内存定位到制定唯一的内存空间。
  • 理解a=10的内存图(引用,指向)
    • 引用:在面向对象的编程语言中变量就是引用。
    • 指向:如果一个变量表示了某块内存,则成为该引用/变量指向了该块内存
      • 如果一个变量指向某块内存,则该变量就可以表示该块内存空间中存储的数据值

顺序表

  • 集合中存储的元素是有顺序的,顺序表的结构可以分为两种形式:单数据类型 (np数组)和多数据类型。
  • python中的列表和元组就属于多数据类型的顺序表
  • 顺序表的弊端:顺序表的结构需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁。

链表

  • 相对于顺序表,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理且进行扩充时不需要进行数据搬迁
  • 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是每一个结点(数据存储单元)里存放下一个结点的信息(即地址)

节点数据结构的封装

# 节点数据结构的封装
class Node():
    def __init__(self,item):
        self.item = item
        self.next = None
  • . is_empty():链表是否为空
  • . length():链表长度
  • . travel():遍历整个链表
  • . add(item):链表头部添加元素
  • . append(item):链表尾部添加元素
  • . insert(pos, item):指定位置添加元素
  • . remove(item):删除节点
  • . search(item):查找节点是否存在
class Link():
    def __init__(self): # 构建一个空的链表
        self._head = None # 只可以指向第一个节点
    
    # 链表头部添加元素
    def add(self,item):
        node = Node(item) # 创建一个新的节点
        node.next = self._head # 让新的第一个节点连接以前的第一个节点
        self._head = node # 让空链表连接新的第一个节点
        
    # 遍历整个链表
    def travel(self):
#         print(self._head.item)
#         print(self._head.next.item)
#         print(self._head.next.next.item) # ...
        cur = self._head
        while cur:
            print(cur.item)
            cur = cur.next
            
    # 查看链表长度        
    def length(self):
        count = 0
        cur = self._head
        while cur:
            count += 1
            cur = cur.next
        return count
    
    # 判断列表是否为空
    def isEmpty(self):
        return self._head == None
    
    # 查询节点是否存在
    def searchItem(self, item):
        find = False
        cur = self._head
        while cur:
            cur_item = cur.item # 遍历节点,将数据值赋给cur_item
            if item == cur_item:
                find = True
                break
            cur = cur.next
        return find
    
    # 向链表尾部添加元素
    def append(self,item):
        node = Node(item)
        
        if self._head == None:# 如果链表为空
            self._head = node
            return
        # 链表非空
        cur = self._head
        pre = None # per永远指向cur前一个节点
        while cur:
            pre = cur
            cur = cur.next
        # 循环结束后pre指向链表的最后一个节点,cur指向空 
        pre.next = node 
    
    # 向指定位置插入节点
    def insert(self,pos,item):
        node = Node(item)
        cur = self._head
        per = None
        if pos == 0: # 如果是往开头插入
            node.next = self._head # 让新元素连接以前的节点
            self._head = node # _head 连接新节点
            return
        if pos < 0 or pos > self.length(): # 如果在不存在的点插入
            print('位置有误,重新输入!!!')
            return
        for i in range(pos): # for循环到插入的位置
            per = cur
            cur = cur.next
        per.next = node
        node.next = cur
        
    # 删除指定节点   
    def remove(self, item):
        cur = self._head
        per = None
        # 如果删的是第一个节点
        if self._head.item == item: # 如果删的是第一个节点
            self._head = cur.next # 让_head直接连接下一个节点
            return
        
        # 如果删不存在的节点
        if not self.searchItem(item):
            print('删除元素不存在!!!')
            return
        
        while cur:
            per = cur
            cur = cur.next
            if cur.item == item:
                break
        per.next = cur.next

 

posted @ 2020-08-05 22:02  闲酒肆中听风吟  阅读(169)  评论(0编辑  收藏  举报