這篇來學習單鏈表的結構和代碼實現過程,重點要理解節點Node這個class的含義,一個節點包含兩部分組成,數據和存儲下一個節點的內存地址。
1.鏈表的定義
鏈表的定義
鏈表(linked list)是一種常見的基礎數據結構,是一種線性表,但是不像順序表一樣連續存儲數據,而是在每一個節點(數據存儲單元)裏存放下一個節點的位置信息(即地址)。
上圖就是一個單鏈表的表示。
2.單鏈表
單向鏈表也就是單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域(指針域),這個鏈接指向鏈表中的下一個節點,而最後一個節點的鏈接域則指向一個空值。
- 表元素域elem用來存放具體的數據。
- 鏈接域next用來存放下一個節點的位置。
- 變量p指向鏈表的頭節點的位置,從p出發能找到表中任意節點。
節點類實現
包下創建一個single_link_list.py模塊。
# coding:utf-8
class Node(object):
"""單鏈表的節點"""
def __init__(self, item):
"""item存放數據元素"""
self.item = item
self.next = None
接下來需要定義單鏈表需要實現方法
is_empty() 鏈表是否爲空
length() 鏈表長度
travel() 遍歷整個鏈表
add(item) 鏈表頭部添加元素
append(item) 鏈表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 刪除節點
search(item) 查找節點是否存在
我們先來實現鏈表的尾部添加元素,和判斷是否爲空,以及遍歷和鏈表長度這四個方法。
# coding:utf-8
class Node(object):
"""節點"""
def __init__(self, item):
self.item = item
self.next = None
class SingleLinkList(object):
"""單鏈表"""
def __init__(self, node = None):
self._head = node
def is_empty(self):
"""判斷鏈表是否爲空"""
return self._head == None
def length(self):
"""鏈表長度"""
# cur遊標 用來移動遍歷元素
cur = self._head
# count記錄數量
count = 0
while cur != None:
count += 1
cur = cur.next
return count
def travel(self):
"""遍歷整個鏈表"""
cur = self._head
while cur != None:
print(cur.item)
cur = cur.next
def add(self, item):
"""鏈表頭部添加元素"""
pass
def append(self, item):
"""鏈表尾部添加元素"""
node = Node(item)
if self.is_empty():
self._head = node
else:
cur = self._head
while cur.next != None:
cur = cur.next
cur.next = node
def insert(self, pos, item):
"""指定位置插入元素"""
pass
def remove(self, item):
"""刪除節點"""
pass
if __name__ == "__main__":
list = SingleLinkList()
print(list.is_empty())
list.append(3)
list.append(5)
list.append(8)
print(list.length())
print("=====遍歷鏈表元素=====")
list.travel()
運行後輸出
True
3
=====遍歷鏈表元素=====
3
5
8
再來看看如何從頭部添加元素,以及插入元素的實現代碼
# coding:utf-8
class Node(object):
"""節點"""
def __init__(self, item):
self.item = item
self.next = None
class SingleLinkList(object):
"""單鏈表"""
def __init__(self, node = None):
self.__head = node
def is_empty(self):
"""判斷鏈表是否爲空"""
return self.__head == None
def length(self):
"""鏈表長度"""
# cur遊標 用來移動遍歷元素
cur = self.__head
# count記錄數量
count = 0
while cur != None:
count += 1
cur = cur.next
return count
def travel(self):
"""遍歷整個鏈表"""
cur = self.__head
while cur != None:
print(cur.item, end=" ")
cur = cur.next
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
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
def insert(self, pos, item):
"""指定位置插入元素"""
# 如果要插入位置小於等於0,說明在頭部添加元素
if pos <= 0:
self.add(item)
# 如果要插入位置大於最後一個節點位置,說尾部添加元素
elif pos > (self.length() - 1):
self.append(item)
else:
pre = self.__head
count = 0
while count < (pos-1):
count += 1
pre = pre.next
# 當循環退出,pre指向pos-1位置
node = Node(item)
node.next = pre.next
pre.next = node
def remove(self, item):
"""刪除節點"""
pass
if __name__ == "__main__":
list = SingleLinkList()
print(list.is_empty())
list.append(3)
list.append(5)
list.append(8)
print(list.length())
print("=====遍歷鏈表元素=====")
list.travel()
print("從頭部添加元素")
list.add(13)
list.insert(2, 45)
print("插入後元素爲")
list.travel()
運行效果
True
3
=====遍歷鏈表元素=====
3 5 8 從頭部添加元素
插入後元素爲
13 3 45 5 8
最後來看看刪除元素和查找元素的代碼
# coding:utf-8
class Node(object):
"""節點"""
def __init__(self, item):
self.item = item
self.next = None
class SingleLinkList(object):
"""單鏈表"""
def __init__(self, node = None):
self.__head = node
def is_empty(self):
"""判斷鏈表是否爲空"""
return self.__head == None
def length(self):
"""鏈表長度"""
# cur遊標 用來移動遍歷元素
cur = self.__head
# count記錄數量
count = 0
while cur != None:
count += 1
cur = cur.next
return count
def travel(self):
"""遍歷整個鏈表"""
cur = self.__head
while cur != None:
print(cur.item, end=" ")
cur = cur.next
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
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
def insert(self, pos, item):
"""指定位置插入元素"""
# 如果要插入位置小於等於0,說明在頭部添加元素
if pos <= 0:
self.add(item)
# 如果要插入位置大於最後一個節點位置,說尾部添加元素
elif pos > (self.length() - 1):
self.append(item)
else:
pre = self.__head
count = 0
while count < (pos-1):
count += 1
pre = pre.next
# 當循環退出,pre指向pos-1位置
node = Node(item)
node.next = pre.next
pre.next = node
def search(self, item):
"""查找元素是否存在"""
cur = self.__head
while cur != None:
if cur.item == item:
return True
else:
cur = cur.next
return False
def remove(self, item):
"""刪除節點"""
cur = self.__head
pre = None
while cur != None:
if cur.item == item:
if cur == self.__head:
self.__head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
if __name__ == "__main__":
list = SingleLinkList()
list.append(3)
list.append(5)
list.append(8)
list.travel()
print("\r")
print("查找元素5在不在")
print(list.search(5))
list.remove(5)
list.travel()
運行下上面測試
3 5 8
查找元素5在不在
True
3 8