zoukankan      html  css  js  c++  java
  • 数据结构与算法(二)

    顺序表:

    1.完整的顺序表包含:元素集合和整体情况的信息

    整体情况的信息:容量元素个数

    2.顺序表的存储结构:一体式分离式(元素外置)

    3.元素存储区域扩充:两种策略:固定数目(节省空间)和倍增(减少扩充次数),

    推荐倍增方式-->以空间换时间

    4.顺序表的删除增加

    头部删除(O(n))和表尾删除(O(1))、

    表头增加(O(n))和表尾增加(O(1))

    5.python中的顺序表怎么实现的

    列表采用分离式的动态顺序表,列表的id相当于顺序表的表头

    6.python列表逆置相关的时间复杂度:(O(n/2)-->O(n))

    7.顺序表和链表的不同:

    顺序表:将元素顺序的存放在连续的存储区域,元素间的顺序关系由存储顺序自然表示

    链表:将元素存放在通过链接构造起来的存储块中

    8.链表

    链表的特点:可以充分利用存储空间,实现灵活的内存动态管理

    链表的结构:元素区(存取元素)和链接区(下一个节点的地址信息)

    单链表的节点:前驱节点--头结点--后继结点--尾节点(指向空值)

    9.Python中的指向问题 : a=100,b=a, 相当于b指向100

    10.python中节点的指向问题:

    1ext=node ,node--->[ item][ next]:next指向节点的这个存储地址node,

    可以通过next.item 或者next.next来获取它的存取元素或下一个节点的位置

    11.单向链表:

    定义的类和异常都使用大驼峰命名

    基本步骤:

    1.创建结点类

    2.单链表的实现

    3.头部添加元素

    4.尾部添加元素

    5.指定位置添加元素

    6.删除结点

    7.查询结点是否存在

    8.测试程序

    源程序:

    class Node(object):
        """结点类"""
    
        def __init__(self, item):
            self.item = item
            self.next = None
    
    
    class SingleLinkList(object):
        """单链表"""
    
        def __init__(self, node=None):
            self.__head = node
    
        def is_empty(self):
            """链表是否为空
            :return 如果链表为空 返回真
            """
            return self.__head is None
    
        def length(self):
            """链表长度"""
            cur = self.__head
            count = 0
            while cur is not None:
                count += 1
                cur = cur.next
            return count
    
        def travel(self):
            """遍历整个链表"""
            cur = self.__head
            while cur is not None:
                print(cur.item, end=" ")
                cur = cur.next
            print("")
    
        def add(self, item):
            """链表头部添加元素
            :param item: 要保存的具体数据
            """
            node = Node(item)
            node.next = self.__head
            self.__head = node
    
    
        def append(self, item):
            """链表尾部添加元素"""
            node = Node(item)
            # 如果链表为空,需要特殊处理
            if self.is_empty():
                self.__head = node
            else:
                cur = self.__head
                while cur.next is not None:
                    cur = cur.next
                # 退出循环的时候,cur指向的尾结点
                cur.next = node
    
        def insert(self, pos, item):
            """指定位置添加元素"""
            # 在头部添加元素
            if pos <= 0:
                self.add(item)
            # 在尾部添加元素
            elif pos >= self.length():
                self.append(item)
            else:
                cur = self.__head
                count = 0
                while count < (pos - 1):
                    count += 1
                    cur = cur.next
                # 退出循环的时候,cur指向pos的前一个位置
                node = Node(item)
                node.next = cur.next
                cur.next = node
    
        def remove(self, item):
            """删除节点"""
            cur = self.__head
            pre = None
            while cur is not None:
                # 找到了要删除的元素
                if cur.item == item:
                    # 在头部找到了元素
                    if cur == self.__head:
                        self.__head = cur.next
                    else:
                        pre.next = cur.next
                    return
                # 不是要找的元素,移动游标
                pre = cur
                cur = cur.next
    
        def search(self, item):
            """查找节点是否存在"""
            cur = self.__head
            while cur is not None:
                if cur.item == item:
                    return True
                cur = cur.next
            return False
    
    
    
    if __name__ == '__main__':
        ll = SingleLinkList()
        print(ll.length())
        ll.travel()
    
        ll.append(1)  # 1
        print(ll.length())
        ll.travel()
    
    
        ll.append(2)  # 1 2
        ll.travel()
    
        ll.add(3)  # 3 1 2
        ll.travel()
    
        ll.insert(0, 4)  # 4 3 1 2
        ll.travel()
    
        ll.insert(19, 5)  # 4 3 1 2 5
        ll.travel()
    
        ll.insert(2, 6)  # 4 3 6 1 2 5
        ll.travel()
    
        ll.remove(4)  # 3 6 1 2 5
        ll.travel()
    
        ll.remove(5)  # 3 6 1 2
        ll.travel()
    
        ll.remove(6)  # 3  1 2
        ll.travel()
    
        ll.remove(3)  # 1 2
        ll.travel()
    
        ll.remove(2)  # 1
        ll.travel()
    
        ll.remove(1)  #
        ll.travel()
    

  • 相关阅读:
    Linux启动报错missing operating system
    Linux tmp目录自动清理总结
    ORACLE口令管理
    oom_kill_process造成数据库挂起并出现found dead shared server
    Oracle shutdown immediate遭遇ORA-24324 ORA-24323 ORA-01089
    从flink-example分析flink组件(1)WordCount batch实战及源码分析
    从mysql高可用架构看高可用架构设计
    由mysql分区想到的分表分库的方案
    六边形效果
    迷你MVVM框架 avalonjs1.5.2 发布
  • 原文地址:https://www.cnblogs.com/mengxinfeng/p/12545545.html
Copyright © 2011-2022 走看看