单链表 / Linked List
目录
链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速。下面将利用Python来完成单链表的实现。
不带表头的单链表通常形式如下,
node_1 -> node_2 -> node_3 -> node_4
完整代码
1 class Node: 2 def __init__(self, val=None, nxt=None): 3 self.value = val 4 self.next = nxt 5 6 def __str__(self): 7 return str(self.value) 8 9 10 class LinkedList: 11 """ 12 Linked list: 13 node_1 -> node_2 -> node_3 -> node_4 14 """ 15 def __init__(self, iterable=()): 16 self.header = None 17 if iterable: 18 self.init(iterable) 19 20 def __str__(self): 21 def _traversal(self): 22 node = self.header 23 while node and node.next: 24 yield node 25 node = node.next 26 yield node 27 return '->'.join(map(lambda x: str(x), _traversal(self))) 28 29 def init(self, iterable=()): 30 # Note: use empty tuple rather than list to init iterable 31 if not iterable: 32 return 33 self.header = Node(iterable[0]) # header value 34 node = self.header 35 for i in iterable[1:]: # add all node 36 node.next = Node(i) 37 node = node.next 38 39 def show(self): 40 print(self) 41 42 @property 43 def length(self): 44 if self.header is None: 45 return 0 46 node = self.header # node pointer points to header 47 i = 1 48 while node.next: 49 node = node.next # node pointer move to next 50 i += 1 51 return i 52 53 @property 54 def is_empty(self): 55 return self.header is None 56 57 def clear(self): 58 self.__init__() 59 # self.header = None 60 61 def append(self, item): 62 self.insert(item, self.length) 63 64 def find(self, item): 65 node = self.header 66 while node.next and node.value != item: 67 node = node.next 68 if node.value == item: 69 return node 70 return None 71 72 def find_previous(self, item): 73 node = self.header 74 while node.next and node.next.value != item: 75 node = node.next 76 if node.next and node.next.value == item: 77 return node 78 return None 79 80 def delete(self, item): 81 ''' 82 node_1 -- X --> node_2 -----> node_3 83 \ / 84 \ / 85 ------------------ 86 ''' 87 prev = self.find_previous(item) 88 if prev: 89 prev.next = prev.next.next 90 91 def insert(self, item, index): 92 ''' 93 ----> node_2 --- 94 / \ 95 / \ 96 node_1 ------- X ---------> node_3 97 98 ''' 99 if abs(index) > self.length: 100 return 101 if index < 0: 102 self.insert(item, self.length+index+1) 103 return 104 elif index == 0: 105 self.insert(self.header.value, 1) 106 self.header.value = item 107 return 108 node = self.header 109 i = 0 110 while i < index-1: 111 node = node.next 112 i += 1 113 n = node.next 114 node.next = Node(item, n) 115 116 117 def test(li): 118 print('Show linked list:') 119 li.show() 120 121 print('\nInit linked list:') 122 li.init([1, 2, 3, 4, 5, 6, 'xd', 8, 9]) 123 li.show() 124 125 print('\nInsert element:') 126 li.insert('xxd', -3) 127 li.show() 128 129 print('\nAppend element:') 130 li.append('10') 131 li.show() 132 133 e = 'xd' 134 print('\nFind element:') 135 x = li.find(e) 136 print(x.value if x else x) 137 print('\nFind previous element:') 138 x = li.find_previous(e) 139 print(x.value if x else x) 140 141 print('\nDelete element:') 142 li.delete('xd') 143 li.show() 144 145 print('\nFind element not exist:') 146 x = li.find(e) 147 print(x.value if x else x) 148 149 print('\nInsert element to header:') 150 li.insert('cc', 0) 151 li.show() 152 153 print('\nClear linked list:') 154 li.clear() 155 li.show() 156 157 print('\nCurrent length: %s' % li.length) 158 print('\nIs empty: %s' % li.is_empty) 159 160 161 if __name__ == '__main__': 162 test(LinkedList())