双链表 / Doubly Linked List


目录

  1. 双链表
  2. 循环双链表

 

双链表

双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指向前一个结点的信息。

Doubly linked list:
       node_1 <---> node_2 <---> node_3

完整代码

 

 1 from linked_list import LinkedList, test
 2 
 3 
 4 class NodeDual:
 5     def __init__(self, val=None, nxt=None, pre=None):
 6         self.value = val
 7         self.next = nxt
 8         self.prev = pre
 9 
10     def __str__(self):
11         return '<NodeDual, prev=%s, value=%s, next=%s>' % (self.prev.value if self.prev else self.prev,
12                                                            self.value, 
13                                                            self.next.value if self.next else self.next)
14 
15 
16 class DoublyLinkedList(LinkedList):
17     """
18     Doubly linked list:
19             node_1 <---> node_2 <---> node_3
20     """
21     def __str__(self):
22         def _traversal(self):
23             node = self.header
24             while node and node.next:
25                 yield node
26                 node = node.next
27             yield node
28         return '<->\n'.join(map(lambda x: str(x), _traversal(self)))
29 
30     def init(self, iterable=()):
31         if not iterable:
32             return
33         self.header = NodeDual(iterable[0])     # header value
34         pre = None
35         node = self.header
36         for i in iterable[1:]:                  # add all node
37             node.prev = pre
38             node.next = NodeDual(i)
39             pre = node
40             node = node.next
41         node.prev = pre
42 
43     def find_previous(self, item):
44         return self.find(item).prev
45 
46     def delete(self, item):
47         pre = self.find_previous(item)
48         if pre:
49             pre.next = pre.next.next
50             pre.next.prev = pre
51 
52     def insert(self, item, index):
53         if abs(index) > self.length:
54             return
55         if index < 0:
56             self.insert(item, self.length+index+1)
57             return
58         elif index == 0:
59             self.insert(self.header.value, 1)
60             self.header.value = item
61             return
62         node = self.header
63         i = 0
64         while i < index-1:
65             node = node.next
66             i += 1
67         n = node.next
68         node.next = NodeDual(item, nxt=n, pre=node)
69         if n:
70             n.prev = node.next
71 
72 
73 if __name__ == '__main__':
74     test(DoublyLinkedList())
View Code

相关文章:

  • 2021-07-27
  • 2021-09-30
  • 2022-12-23
  • 2021-02-14
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2023-01-07
  • 2021-11-12
  • 2022-12-23
  • 2021-09-09
相关资源
相似解决方案