請設計乙個單鏈表,並在鍊錶類中實現下列操作:
說明:鍊錶節點的索引 index 是從 0 開始計算,比如鍊錶中索引 1 下的節點,指的是鍊錶中的第二個節點。
class listnode: # 定義單鏈表
def __init__(self, val=0, next=none):
self.val = val # 鍊錶節點上儲存的元素
self.next = next # 指向下乙個鍊錶節點
class mylinkedlist:
def __init__(self):
self.dummy_head = listnode(0) # 定義虛擬頭節點
self.length = 0 # 定義鍊錶的長度
def get(self, index: int) -> int:
if 0 <= index < self.length:
cur = self.dummy_head
cur = cur.next # 因為多了乙個虛擬頭節點,所以需提前移動1位
while index: # 迴圈操作,讓 cur 移動 index 位
cur = cur.next
index -= 1
return cur.val
else: # 鍊錶節點不存在,直接返回-1
return -1
def add_at_head(self, val: int) -> none:
cur = self.dummy_head
old_head = cur.next # 臨時儲存原鍊錶的頭節點
cur.next = listnode(val=val, next=old_head) # 改變節點指向,讓虛擬頭節點通過 next 指向新加的節點,新節點則通過 next 指向原鍊錶的頭節點
self.length += 1 # 鍊錶長度+1
def add_at_tail(self, val: int) -> none:
cur = self.dummy_head
while cur.next is not none: # cur 不是鍊錶最後乙個節點
cur = cur.next
cur.next = listnode(val=val, next=none) # 鍊錶最後乙個節點通過 next 指向新加的節點,新節點則通過 next 指向none
self.length += 1 # 鍊錶長度+1
def add_at_index(self, index: int, val: int) -> none:
if 0 <= index <= self.length:
cur = self.dummy_head
while index: # 迴圈操作,讓 cur 移動 index 位
cur = cur.next
index -= 1
if index != self.length: # 如果 index 不等於鍊錶長度, 那麼讓cur通過 next 指向新加的節點,新節點則通過 next 指向cur的下個節點
post_head = cur.next
cur.next = listnode(val=val, next=post_head)
else: # 如果 index 恰好等於鍊錶長度,那麼在鍊錶末尾新增節點
cur.next = listnode(val=val, next=none)
self.length += 1 # 鍊錶長度+1
elif index < 0:
self.add_at_head(val)
def delete_at_index(self, index: int) -> none:
if 0 <= index < self.length:
cur = self.dummy_head
while index: # 迴圈操作,讓 cur 移動 index 位
cur = cur.next
index -= 1
cur.next = cur.next.next # 刪除節點
self.length -= 1 # 鍊錶長度-1
def list_node_to_list(node): # 將單向鍊錶轉換為列表
result =
while node:
node = node.next
return result
if __name__ == '__main__':
obj = mylinkedlist()
obj.add_at_head(10) # 在鍊錶開頭加新節點
obj.add_at_tail(3) # 在鍊錶末尾加新節點
print(list_node_to_list(obj.dummy_head.next))
obj.add_at_index(1, 2) # 在鍊錶索引1位置加新節點
print(list_node_to_list(obj.dummy_head.next))
print(obj.get(1))
obj.delete_at_index(1) # 刪除鍊錶索引1位置的節點
print(obj.get(1))
print(list_node_to_list(obj.dummy_head.next))
執行**後,得到如下結果:
[10, 3]
[10, 2, 3]23
[10, 3]
python程式設計題彙總(持續更新中……) python程式設計題 python程式設計題庫
上期題目連線 1000道python題庫系列分享十一 9道 上期題目答案 本期題目 機器之心報道機器之心編輯部想要備戰 python 面試,這兩個專案有千道 python 問題與實現。之前機器之心介紹了 phd 大牛的求職之路,很多讀者感覺這位大牛太厲害了,他的經歷對我們幫助不大。對於一般的機器學習...
50道經典Java邏輯程式設計題 1 3
程式1 題目 古典問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?1.程式分析 兔子的規律為數列1,1,2,3,5,8,13,21.class yue public int getyue class rabbi...
python程式設計 單繼承
繼承的作用 貓類和狗類都是動物類,但是又各有區別。如果沒有繼承,那麼貓類和狗類就都需要建立各自的方法 如果它們都繼承自動物類,那麼很多共同的地方就只需要在動物類中定義一次即可,精簡了 繼承前 繼承前,各個類都需要自己定義自己的方法,不夠精簡 class animal def shout self p...