双向链表的简单实现

双向链表的特点是:第一个元素的 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])

 部分打印结果:

  

猜你喜欢

转载自www.cnblogs.com/JerryZao/p/9700308.html