1. 程式人生 > 實用技巧 >演算法-01-單鏈表

演算法-01-單鏈表

# 首先定義一個結點類
class Node(object):
def __init__(self, elem):
# 生成結點的資料區
self.elem = elem
# 生成結點的指標域
self.next = None

# 其次定義出連結串列類
class SingleLinkList(object):
# 用__init__方法實現,當建立連結串列時,同時建立一個頭結點.如果沒有頭結點,那它無法實現指標與Node類生成的結點之間的連結.
def __init__(self, node=None): # 用node=None是為了預設頭結點為空,這也是為了使你在建立SingleLinkList物件時,不傳頭結點的情況下,也能正常輸出

self.__head = node

# 判空同理,也不需要傳其他引數進來
def is_empty(self):
return self.__head == None

# 求連結串列長度,求的也是該連結串列類的物件,因此不需要再傳其他引數進來
def length(self):
count = 0
cur = self.__head # 使指標指向頭結點
while cur != None:
count += 1
cur = cur.next
return count


# 遍歷的是連結串列,也即是連結串列類的物件.而self就是連結串列類物件,因此不需要再傳其他引數進來
def travel(self):
cur = self.__head
while cur.next != None:
print(cur.elem)
cur = cur.next

# 在頭部新增結點,需要把該結點給傳進來,因此需要傳個item(結點)
def add(self, item):
node = Node(item)
node.next = self.__head
# 使新結點先指向原頭結點

self.__head = node # 再使頭結點指向新結點,這個順序不能改變,因為若是先讓頭結點指向新結點的話,就會使頭結點與其後的其他結點斷開連線,致使資料丟失.

# 同add類似,尾部新增結點時,需要把該結點的資料域作為引數傳進來
def append(self, item):
node = Node(item) # 建立想要新增的結點
if self.is_empty(): # 判斷連結串列是否為空,因為空連結串列是沒有next域的,也即空連結串列會在while迴圈處出錯
self.__head = node # 當連結串列為空時,則新增的連結串列就會成為該連結串列的頭結點
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node # 把結點新增進連結串列

# 插入需要給三個引數,一個是要插入的連結串列,一個是插入的位置,另一個是要插入的結點
def insert(self, pos, item):
node = Node(item)
if pos <= 0:
self.add(item)
elif pos > (self.length()-1): # 不能有等於,因為等於的話表示在尾結點之前插入新結點了.注意了pos等於幾,就表示在下標幾之前新增,
self.append(item) # eg: pos=2,表示在連結串列下標為2的結點前插入新結點.也即是在連結串列下標1-2之間插入新結點,而非2後
else:
count = 0
pre = self.__head
while count < pos-1:
count += 1
pre = pre.next
node.next = pre.next
pre.next = node

# 刪除指定結點,因此需要把你想要刪除的結點傳進來
def remove(self, item):
cur = self.__head # 先使cur遊標指向首結點
pre = None # 使pre遊標指向為None.是為下面pre指向cur做鋪墊
while cur != None:
if cur.elem == item:
# 先判斷此結點是否為頭結點
if cur == self.__head:
self.__head = cur.next # 實現對頭結點的刪除
break # 當找到想要刪除的值時,需要退出迴圈
else:
pre.next = cur.next # 實現對結點的刪除
break
else:
pre = cur # 使pre遊標指向cur遊標的位置
cur = cur.next # 實現cur遊標向後移一步的操作,這一句程式碼必須要放在pre指向cur之後,才能保證倆遊標之間總會隔著一個結點
break

# 查詢結點是否存在,也需要你傳進來你想要查的結點
def search(self, item):
cur = self.__head
while cur != None:
if cur.elem == item:
return True
else:
cur = cur.next
return False

# 建立一個結點,資料域為100,指標域預設為空
node = Node(100)
# 把建立的結點傳進連結串列中作為頭結點
single_obj = SingleLinkList(node)
single_obj.travel()