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()
    

  • 相关阅读:
    POJ 1251 Jungle Roads
    1111 Online Map (30 分)
    1122 Hamiltonian Cycle (25 分)
    POJ 2560 Freckles
    1087 All Roads Lead to Rome (30 分)
    1072 Gas Station (30 分)
    1018 Public Bike Management (30 分)
    1030 Travel Plan (30 分)
    22. bootstrap组件#巨幕和旋转图标
    3. Spring配置文件
  • 原文地址:https://www.cnblogs.com/mengxinfeng/p/12545545.html
Copyright © 2011-2022 走看看