zoukankan      html  css  js  c++  java
  • 双向链表的简单实现

    双向链表的特点是:第一个元素的 prev 是None

     1 # 双向链表:
     2 class Node:
     3     def __init__(self,  node=None, prev=None,  next=None):
     4         # 注意顺序,因为实例化,一般不会关键字传参, 如果node= None(1) 1 是给node形参的,如果形参列表不同,则会出现异常
     5         self.prev = prev
     6         self.node = node
     7         self.next = next
     8 
     9     def __repr__(self):
    10         return '{} <-- {} --> {}'.format(
    11             self.prev.node if self.prev else None,
    12             self.node,
    13             None if self.next is None else self.next.node)
    14 
    15 class DoubleLinkList:
    16     def __init__(self, head= None, tail=None):
    17         self.head = head
    18         self.tail = tail
    19         self.lens = 0
    20 
    21     def append(self, node):
    22         node = Node(node)
    23         if self.head is None:
    24             self.head = node
    25         else:
    26             self.tail.next = node
    27             node.prev = self.tail
    28         self.tail = node
    29         self.lens += 1
    30 
    31     def iternode(self, reverse=True):
    32         if self.head is None:
    33             raise  Exception('This is a Emppty linklist')
    34         current = self.head if reverse else self.tail
    35         while current:
    36             yield  current
    37             current = current.next if reverse else current.prev
    38 
    39     def __iter__(self):
    40         if self.head is None:
    41             raise  Exception('This is a Emppty linklist')
    42         current = self.head
    43         while current:
    44             yield current
    45             current = current.next
    46 
    47     def __getitem__(self, index):
    48         reverse = True if index>=0 else False
    49         start = 0 if index>=0 else 1
    50         for i, v in enumerate(ll.iternode(reverse), start):
    51             if i == abs(index):
    52                 return v
    53 
    54     def __setitem__(self, index, value):
    55         ll[index].node = value
    56 
    57     def __len__(self):
    58         return self.len
    59 
    60     def remove(self):
    61         pass
    62         # 先判断是否为空
    63         # 需要遍历,利用iter
    64         # 注意是中间,第一个,还是尾部删除
    65 
    66     def pop(self):
    67         pass
    68         # 值删除尾部,self.tail.next = None
    69 
    70     def insert(self, index):
    71         pass
    72         # 类似于remove
    73     
    74 
    75 
    76 ll = DoubleLinkList()
    77 ll.append(1)
    78 ll.append(2)
    79 ll.append(3)
    80 ll.append(4)
    81 ll.append(5)
    82 
    83 for i in ll.iternode(False):
    84     print(i)
    85 print('----'* 20)
    86 print(ll[-1])
    87 
    88 ll[-1] = 10000
    89 print(ll[-1])

     部分打印结果:

      

    为什么要坚持,想一想当初!
  • 相关阅读:
    JavaScript--微博发布效果
    JavaScript--模拟百度搜索下拉li
    JavaScript--for in循环访问属性用"."和[ ]的区别
    JavaScript--函数中()的作用
    JavaScript--时间日期格式化封装
    【网络】Vmware虚拟机下三种网络模式配置
    【IP】DHCP介绍
    【Shell】ps -ef 和ps aux
    【基础】Pipeline
    【时间】Unix时间戳
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9700308.html
Copyright © 2011-2022 走看看