鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是不像順序表一樣連續存儲數據,而是在每一個節點(數據存儲單元)裏存放下一個節點的位置信息(即地址)。
爲什麼需要鏈表:
- 順序表的構建需要預先知道數據大小來申請連續的存儲空間,而在進行擴充時又需要進行數據的搬遷,所以使用起來並不是很靈活。
- 鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。
單向鏈表:單向鏈表也叫單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節點,而最後一個節點的鏈接域則指向一個空值。
# 單鏈表基於Python語言的實現
'''
單向鏈表需要實現的方法:
is_empty() 鏈表是否爲空
len() 鏈表長度
travel() 遍歷整個鏈表
add(item) 鏈表頭部添加元素
append(item) 鏈表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 刪除節點
search(item) 查找節點是否存在
'''
class Node(object):
"""
節點類
"""
def __init__(self, value):
# 元素域
self.value = value
# 鏈接域
self.next = None
class OneWayLinkList(object):
"""
單向鏈表類
"""
def __init__(self, node=None):
# 初始化頭節點
self.__head = node
def __len__(self):
"""
返回鏈表長度
"""
# 遊標,用來遍歷鏈表
cur = self.__head
# 記錄遍歷次數
count = 0
# 當前節點爲None則說明已經遍歷完畢
while cur:
count += 1
cur = cur.next
return count
def is_empty(self):
"""
判斷鏈表是否爲空
"""
# 頭節點不爲None則不爲空
return self.__head == None
def add(self, value):
"""
頭部插法
先讓新節點的next指向頭節點
再將頭節點替換爲新節點
順序不可錯,要先保證原鏈表的鏈不斷,否則頭節點後面的鏈會丟失
"""
node = Node(value)
node.next = self.__head
self.__head = node
def append(self, value):
"""
尾部插法
"""
node = Node(value)
cur = self.__head
if self.is_empty():
self.__head = node
else:
while cur.next:
cur = cur.next
cur.next = node
def insert(self, pos, value):
"""
指定位置插入元素
"""
# 應對特殊情況
if pos <= 0:
self.add(value)
elif pos > len(self) - 1:
self.append(value)
else:
node = Node(value)
prior = self.__head
count = 0
# 在插入位置的前一個節點停下
while count < (pos - 1):
prior = prior.next
count += 1
# 先將插入節點與節點後的節點連接,防止鏈表斷掉,先鏈接後面的,再鏈接前面的
node.next = prior.next
prior.next = node
def remove(self, value):
"""
移除元素
"""
cur = self.__head
prior = None
while cur:
if value == cur.value:
# 判斷此節點是否是頭節點
if cur == self.__head:
self.__head = cur.next
else:
prior.next = cur.next
break
# 還沒找到節點,繼續遍歷
else:
prior = cur
cur = cur.next
def search(self, value):
"""
搜索元素
"""
cur = self.__head
while cur:
if value == cur.value:
return True
cur = cur.next
return False
def travel(self):
"""
遍歷鏈表
"""
cur = self.__head
while cur:
print(cur.value)
cur = cur.next
if __name__ == "__main__":
link_list = OneWayLinkList()
link_list.append('a')
link_list.append('b')
link_list.append('d')
# link_list.insert(2, 'c')
link_list.travel()
print(len(link_list))
print(link_list.search(3))