Python实现双链表操作

  1 '''
  2     创建一个结点类
  3 '''
  4 
  5 
  6 class Node:
  7     def __init__(self, value=None):
  8         self.value = value
  9         self.prev = None
 10         self.next = None
 11 
 12 
 13 '''
 14     创建一个双链表
 15 '''
 16 
 17 
 18 class doubleLink:
 19     def __init__(self):
 20         self.header = None  # 初始化头结点
 21         self.length = 0  # 链表的长度
 22 
 23     # 判断链表是否为空
 24     def is_empty(self):
 25         return self.length == 0
 26 
 27     '''
 28         实现向双链表添加元素的功能
 29         有三种实现方式:
 30         1.头插法
 31         2.尾插法
 32         3.向双链表的指定位置添加元素
 33     '''
 34 
 35     # 1.头插法
 36     def __add__(self, value):
 37         node = Node(value)
 38         if self.is_empty():
 39             node.prev = self.header
 40             self.header = node
 41             self.length += 1
 42             return
 43         else:
 44             node.next = self.header
 45             self.header.prev = node
 46             self.header = node
 47             self.length += 1
 48 
 49     # 2.尾插法
 50     def append(self, value):
 51         node = Node(value)
 52         if self.is_empty():
 53             self.__add__(value)
 54         else:
 55             cur = self.header
 56             while cur.next is not None:
 57                 cur = cur.next
 58             cur.next = node
 59             node.prev = cur
 60         self.length += 1
 61 
 62     # 3.向双链表的指定位置添加元素
 63     def insert(self, index, value):
 64         node = Node(value)
 65         cur = self.header
 66         if index <= 0 or index > self.length:
 67             print('您输入的信息有误')
 68             return ' '
 69         if index == 1:
 70             self.__add__(value)
 71         for i in range(2, index):
 72             cur = cur.next
 73         node.next = cur.next
 74         cur.next.prev = node
 75         cur.next = node
 76         node.prev = cur
 77         self.length += 1
 78         return value
 79 
 80     '''
 81         实现插寻双链表元素的功能
 82         有三种实现方式:
 83         1.根据索引查询元素
 84         2.直接查询元素
 85         3.遍历整个双链表,并打印出所有的元素
 86     '''
 87 
 88     # 1.根据索引查询元素
 89     def __getitem__(self, index):
 90         cur = self.header
 91         for i in range(index - 1):
 92             cur = cur.next
 93         return cur.value
 94 
 95     # 2.直接查询元素,并返回该元素的索引
 96     def getIndex(self, value):
 97         cur = self.header
 98         temp = 0
 99         while cur.next is not self.header:
100             if cur.value == value:
101                 return temp + 1
102             cur = cur.next
103             temp += 1
104 
105     # 3.遍历整个双链表,并打印出所有的元素
106     def getAll(self):
107         if self.is_empty():
108             print('目前双链表中没有元素!')
109             return
110         cur = self.header
111         for i in range(self.length):
112             print('%d' % cur.value, end=' ')
113             cur = cur.next
114 
115     # 4.查询某个元素的后继节点
116     def getItem(self, value):
117         cur = self.header
118         temp = 0
119         while cur.next is not self.header:
120             if cur.value == value:
121                 if cur.next is not None:
122                     return cur.next.value
123                 else:
124                     return -1
125             cur = cur.next
126             temp += 1
127 
128     # 5.查询某个元素的前驱节点
129     def getPrevItem(self, value):
130         cur = self.header
131         temp = 0
132         while cur.next is not self.header:
133             if cur.value == value:
134                 if cur.prev is not None:
135                     return cur.prev.value
136                 else:
137                     return -1
138             cur = cur.next
139             temp += 1
140 
141     '''
142         实现修改指定位置元素的功能
143     '''
144 
145     def __setitem__(self, index, value):
146         cur = self.header
147         for i in range(index - 1):
148             cur = cur.next
149         cur.value = value
150         return value
151 
152     '''
153         实现删除双链表元素的功能
154        
155     '''
156     # 直接删除元素
157     def __delete__(self, value):
158         cur = self.header
159         if self.getIndex(value) == 1:
160             self.header = cur.next
161             self.length -= 1
162         elif self.getIndex(value) != 1:
163             while self.getIndex(value) != self.length:
164                 cur = cur.next
165             cur=None
166             self.length -= 1
167         else:
168             while cur.value != value:
169                 cur = cur.next
170             cur.prev.next = cur.next
171             cur.next.prev = cur.prev
172             self.length -= 1
173 
174 
175 if __name__ == '__main__':
176     s = doubleLink()
177     s.__add__(12)
178     s.__add__(13)
179     s.__add__(14)
180     s.__add__(15)
181     s.append(22)
182     s.getAll()
183     print('\n第%d个位置的元素是%d.' % (1, s.__getitem__(1)))
184     print('\n元素%d在双链表的第%d个位置' % (14, s.getIndex(14)))
185     print('获取元素%d的后继节点%d' % (12, s.getItem(12)))
186     print('获取元素%d的前驱节点%d' % (13, s.getPrevItem(13)))
187     print('在第%d个位置插入元素%d:' % (2, s.insert(2, 45)))
188     s.getAll()
189     print('\n将第%d个位置的元素修改为%d:' % (1, s.__setitem__(1, 900)))
190     s.getAll()
191     print('\n删除第%d个元素:' % 5)
192     s.__delitem__(5)
193     print('\n删除元素22:')
194     s.__delete__(22)
195     s.getAll()

 

上一篇:php+html5实现无刷新上传,大文件分片上传,断点续传


下一篇:html5图像标签的简单总结