鏈表是一種常見的數據結構,屬於線性表的一種,但不會按照線性的順序存儲數據。
由於不按照順序存儲,鏈表在存儲的時候是O(1)的複雜度。
鏈表包含:單向鏈表、雙向鏈表、循環鏈表、塊狀鏈表
本文主要是單向鏈表的實踐,也是鏈表中最簡單的一種,它包含了兩個域,一個用於數據存儲,一個指向下一個節點,而最後一個節點指向None。
單向鏈表只可以往一個方向遍歷,這也是名字的由來。
實踐代碼:
# -*- encoding: utf-8 -*-
"""
@File : singleLinkedList
@Author : TopAbu.com
@Software: IntelliJ IDEA
"""
# 1.定義節點類:item、next
# 2.定義單向鏈表類:定義一個屬性保存頭節點(需要根據頭節點獲取後續所有節點)
class Node(object):
name = '節點類'
def __init__(self, item):
self.item = item
self.next = None
def __repr__(self):
return str(self.item)
class SingleLinkedList(object):
name = '單向鏈表'
def __init__(self):
self.__head = None
def is_empty(self):
'''判斷是否爲空'''
return self.__head is None
def length(self):
'''返回鏈表的長度'''
cur = self.__head
count = 0
while cur is not None:
count += 1
cur = cur.next
return count
def travel(self):
'''打印鏈表中的每一個元素'''
cur = self.__head
while cur is not None:
print(cur.item)
cur = cur.next
def search(self, item):
'''查找某一元素是否在鏈表中'''
cur = self.__head
while cur is not None:
if cur.item == item:
return True
cur = cur.next
return False
def add(self, item):
'''鏈表頭部添加元素'''
node = Node(item)
node.next = self.__head
self.__head = node
def append(self, item):
'''在尾部添加元素'''
node = Node(item)
if self.is_empty():
self.__head = node
cur = self.__head
while cur.next is not None:
cur = cur.next
cur.next = node
def insert(self, item, pos):
'''
在指定位置添加元素
item -> 元素
pos -> 插入位置
'''
if pos <= 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
count = 0
cur = self.__head
node = Node(item)
while count < (pos - 1):
cur = cur.next
count += 1
node.next = cur.next
cur.next = node
def remove(self, item):
'''刪除節點,默認刪除一個元素'''
cur = self.__head
pre = None
while cur is not None:
if cur.item == item:
if cur == self.__head:
self.__head = cur.next
else:
pre.next = cur.next
return
pre = cur
cur = cur.next
if __name__ == '__main__':
ll = SingleLinkedList()
print(ll.is_empty())
print(ll.length())
ll.add(1)
print(ll.search(1))
ll.append('a')
ll.add('b')
ll.insert('p', 2)
print('*'*20)
ll.travel()
print('*'*20)
ll.remove('p')
ll.travel()