双链表 / Doubly Linked List
目录
双链表和单链表的不同之处在于,双链表需要多增加一个域(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())