參照python基本數據類型list實現部分功能 :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class BaseNode(object):
"""
結點
"""
def __init__(self, item):
# 結點的值
self.item = item
# 下一個結點
self.next = None
class SingleLinkedList(object):
"""
單項鍊表
保存一個鏈表只需要保存它的頭結點即可
"""
def __init__(self, node=None):
# 頭結點
self.head = node
def is_empty(self):
"""
判斷鏈表好似否爲空
:return: bool
"""
return self.head is None
def length(self):
"""
鏈表的長度
:return: 鏈表的結點個數
"""
# 用於記錄鏈表的結點個數
length = 0
# 獲取頭結點
node = self.head
# 如果當前結點不是None
while node:
# 結點個數加1
length += 1
# 將當前結點指定到下個結點
node = node.next
# 返回結點個數
return length
def __str__(self):
"""
打印實例時的輸出
:return:
"""
# 獲取頭結點
node = self.head
travel = "["
while node:
if node == self.head:
travel += str(node.item)
else:
travel += ", %r" % node.item
node = node.next
return travel + "]"
def search(self, item):
"""
查詢值是否在鏈表中
:param item: 要查詢的值
:return: bool
"""
# 獲取頭結點
node = self.head
# 如果當前結點不爲None
while node:
# 如果當期按結點的值等於要查詢的值
if node.item == item:
# 返回True
return True
node = node.next
else:
# 如果所有結點的值都不等於要查詢的值 返回False
return False
def add(self, item):
"""
從頭部添加一個結點
item: 將要添加的結點的值
:return: None
"""
# 創建結點
new_node = BaseNode(item)
# 把將要添加的結點的下一個結點指向鏈表的頭結點,並將鏈表的頭結點指向將要添加的結點
new_node.next, self.head = self.head, new_node
def append(self, item):
"""
從尾部添加一個結點
:param item: 將要添加的結點的值
:return: None
"""
# 創建新結點
new_node = BaseNode(item)
# 如果鏈表爲空
if self.head is None:
# 則將鏈表的頭結點指向新結點
self.head = new_node
else:
# 獲取頭結點
node = self.head
# 如果當前結點不爲None
while node.next:
# 將當前結點指向下一個結點
node = node.next
# 將當前結點的下一個結點指向新結點
node.next = new_node
def insert(self, site, item):
"""
插入數據
:param site: 插入的位置
:param item: 插入的值
:return:
"""
# 判斷位置參數是否是int類型
if not isinstance(site, int):
raise TypeError("site must be integers")
# 如果要插入的位置小於等於0
if site <= 0:
# 從頭部添加
self.add(item)
# 如果要插入的位置大於或等於鏈表的最大長度
elif site >= self.length():
# 從尾部添加
self.append(item)
else:
# 創建新結點
new_node = BaseNode(item)
# 獲取頭結點
node = self.head
# 獲取要插入的上一個結點
for i in range(site - 1):
node = node.next
# 將新的結點的下一個結點指向當前結點的下一個結點 並把當前結點的下一個結點指向新結點
new_node.next, node.next = node.next, new_node
def clear(self):
"""
清空鏈表
:return:
"""
self.head = None
def __getitem__(self, site):
"""根據索引取出對應的值"""
# 判斷位置參數是否是int類型
if not isinstance(site, int):
raise TypeError("site must be integers")
if self.length() <= site:
raise IndexError('Out of range')
node = self.head
for i in range(site):
node = node.next
return node.item
def __setitem__(self, site, item):
"""
設置結點的值
:param site: 結點位置
:param item: 要修改值
:return:
"""
# 判斷位置參數是否是int類型
if not isinstance(site, int):
raise TypeError("site must be integers")
if self.length() <= site:
raise IndexError('Out of range')
node = self.head
for i in range(site):
node = node.next
node.item = item
def remove(self, item):
"""
根據值刪除結點
:param item: 要刪除的值
:return:
"""
if self.head:
# 獲取頭結點
node = self.head
# 如果頭結點是要刪除的結點
if node.item == item:
# 將頭結點指向當前頭結點的下一個結點
self.head = node.next
# 返回
return
# 如果當前結點有下一個結點
while node.next:
# 如果當前結點的下一個結點是要刪除的節點
if node.next.item == item:
# 將當前結點的下一個結點指向當前結點的下下個節點
node.next = node.next.next
# 返回
return
# 將當前結點指向下一個結點
node = node.next
# 如果以上條件都不滿足 則說明值不在鏈表內
raise ValueError('item not in SingleLinkedList')
順序表和鏈表的區別參考:https://blog.csdn.net/Y1730008223CONG/article/details/68958022