zoukankan      html  css  js  c++  java
  • 双链表复习

      1 # 实现双链表
      2 class Node(object):
      3     # 前驱 数据 后继
      4     def __init__(self,data):
      5         self.pre = None
      6         # 前驱
      7         self.data = self.data 
      8         # 数据
      9         self.next = None
     10         # 后继
     11 
     12 class DoubleLianBiao(object):
     13     # 定义一个双链表 将节点连接起来
     14     def __init__(self,node = None):
     15         # 指向节点 如果没传递则使用 None
     16         self._head = node
     17         # 定义头节点,指向实例化类对象时传递的节点指向
     18 
     19     def is_empty(self):
     20         '''链表是否为空'''
     21         return self._head is None
     22 
     23     def length(self):
     24         '''查询链表长度'''    
     25         cur = self._head
     26         # cur 为当前指向的指针
     27         count = 0 
     28         # 记录长度
     29         while cur != None:
     30             # 当前指向不为 None
     31             count += 1 
     32             # 数量加 1
     33             cur = cur.next
     34             # 将指针对节点进行移动
     35         # 如果第一个节点为 None ,依旧是返回 0
     36         return count
     37         # 返回节点数量
     38 
     39 
     40     def travel(self):
     41         '''遍历整个链表'''
     42         cur = self._head
     43         while cur != None:
     44             # 如果不为空 则打印数据
     45             print(cur.data,end = " ")
     46             # 打印数据
     47             cur = cur.next
     48             # 向下遍历
     49 
     50 
     51     def add(self,data):
     52         '''链表头部添加元素'''
     53         node = Node(data)
     54         # 将节点指向头部
     55         node.next = self._head
     56         # 将头部作为节点的下一个元素
     57         self._head = node
     58         # 将 node 作为头节点
     59         node.next.pre = node
     60         # 牵右手 让 node 后的节点指向node
     61 
     62     def append(self,data):
     63            '''链表尾部添加元素'''
     64            node = Node(data)
     65            # 创建一个节点
     66 
     67            # 特殊情况 第一个节点为空
     68            if self.is_empty():
     69                self._head = node
     70                # 头节点为 node 
     71            else:
     72                cur = self._head
     73                while cur.next != None:
     74                    cur = cur.next
     75                # cur.next.data = node.data 
     76                # 不需要添加数据
     77                cur.next = node
     78                # 添加节点
     79                node.pre = cur 
     80                # 连接左面的两只手 
     81 
     82     def insert(self,pos,data):
     83            '''指定位置添加元素'''
     84            # 如果为零位置 
     85            if pos <= 0:
     86                self.add(data)
     87                # 添加节点
     88            elif pos > (self.length()-1):
     89                # 到最后一个元素
     90                self.append(data)
     91                # 添加节点
     92            else:
     93                node = Node(data)
     94                index = 0
     95                cur = self._head
     96                while index < pos :
     97                    # 遍历到 pos 前一个位置
     98                    index += 1
     99                    cur = cur.next 
    100                    # 不断向下移动
    101                node.next = cur
    102                # 右手:node 连接 当前指向的节点
    103                node.pre = cur.pre
    104                # 左手:node 的前一个节点为当前位置的前一个节点
    105                cur.pre.next = node
    106                # 左手:当前位置的前一个节点的下一个节点为 node 节点
    107                cur.pre = node
    108                # 右手:当前位置的前一个节点 为 node 节点    
    109 
    110     def remove(self,data):
    111            '''删除节点'''
    112            cur = self._head
    113            # 设置游标表示前一个游标
    114            while cur != None:
    115                if cur.data == data:
    116                    # 如果 cur 指向的节点为要删除的节点
    117                    if cur == self._head:
    118                        # 如果数据为头节点的数据
    119                        self._head = cur.next 
    120                        # 跳过 cur 
    121                        if cur.next != None:
    122                            # 如果只有一个节点,None 没有pre属性
    123                            cur.next.pre = None
    124                            # 删除头节点后 头节点值为 None
    125                    else:
    126                        # 如果不是头节点
    127                        cur.pre.next = cur.next
    128                        # 左手:当前节点的前一个节点的后一个节点为当前节点的后一个节点
    129                        if cur.next != None:
    130                            # 查看是否是最后一个节点,None 没有 pre 属性
    131                            cur.next.pre = cur.pre 
    132                            # 右手:当前节点的下一个节点的前一个节点为当前节点的前一个节点
    133                    break
    134                    # 找到数据跳出循环
    135                else:
    136                    # 如果还没有找到数据
    137                    cur = cur.next
    138                    # 向下移动
    139 
    140     def search(self,data):
    141         '''查找节点是否存在'''
    142         cur = self._head
    143         # 指向头节点
    144         while cur.next != None:
    145             # 如果下一个节点不为空
    146             if cur.data == data:
    147                 # 如果找到了数据
    148                 return True
    149             else:
    150                 cur = cur.next
    151                 # 继续向下寻找
    152         return False
    153         # 没有找到该数据

    2020-04-14

  • 相关阅读:
    【BZOJ4008】[HNOI2015] 亚瑟王(DP)
    【BZOJ4416】 [SHOI2013] 阶乘字符串(状压DP)
    【BZOJ4524】[CQOI2016] 伪光滑数(堆的套路题)
    【洛谷5336】[THUSC2016] 成绩单(区间DP)
    【洛谷4238】【模板】多项式乘法逆
    【洛谷4707】重返现世(kth Min-Max容斥+动态规划)
    【洛谷5339】[TJOI2019] 唱、跳、rap和篮球(容斥+NTT)
    【洛谷3723】[AH2017/HNOI2017] 礼物(FFT)
    【LOJ2290】「THUWC2017」随机二分图(状压+记忆化搜索)
    【洛谷5795】[THUSC2015] 异或运算(可持久化Trie)
  • 原文地址:https://www.cnblogs.com/hany-postq473111315/p/12697287.html
Copyright © 2011-2022 走看看