单链表 / Linked List


目录

  1.  单链表
  2.  带表头单链表

 

链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速。下面将利用Python来完成单链表的实现。

1 单链表

不带表头的单链表通常形式如下,

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())
View Code

相关文章: