從單鏈表 list 中刪除第 i 個元素
- 一、問題引入
- 二、解題步驟
- 1.思維導圖
- 2.解題步驟
- 三、代碼實現
- 四、個人總結
一、問題引入
請編寫程序,將 n 個整數順次插入一個初始為空的單鏈表的表頭。隨后對任意給定的位序 i,刪除鏈表中第 i 個結點。注意:i 代表位序,從 1 開始。刪除結束后,輸出鏈表長度,并順序輸出鏈表中的每個結點的數值。
輸入格式:
輸入首先在第一行給出正整數 n(≤10^4);隨后一行給出 n 個 int 范圍內的整數,數字間以空格分隔;最后一行給出刪除位序 i,為 int 范圍內的整數。
輸出格式:
如果刪除的位置不合法,則不能刪除,在一行中輸出句子 錯誤:刪除位置不合法。。無論是否刪除成功,都按照題面描述的要求,在一行中輸出鏈表信息,格式為:
表長: x1 x2 … xn
注意數字間有 1 個空格分隔,行首尾無多余空格。
輸入樣例 :
5
1 2 3 4 5
3
輸出樣例:
4: 5 4 2 1
二、解題步驟
1.思維導圖
2.解題步驟
步驟1:創建鏈表
- 初始化一個空鏈表(使用頭結點)
- 讀取n個整數
- 將每個整數插入到鏈表頭部(頭插法)
步驟2:刪除指定位置節點
- 檢查刪除位置i是否合法(1 ≤ i ≤ 鏈表長度)
- 從頭結點開始遍歷,找到第i-1個節點
- 將第i-1個節點的next指向第i+1個節點
- 釋放第i個節點的內存
步驟3:輸出結果
- 根據刪除是否成功,計算并輸出鏈表長度
- 遍歷鏈表,輸出所有節點的值
三、代碼實現
class LNode:def __init__(self, data=None):self.data = dataself.next = Noneclass LinkList:def __init__(self):self.head = LNode() # 頭結點def create_list(self, n):"""創建鏈表"""for _ in range(n):num = int(input())new_node = LNode(num)new_node.next = self.head.nextself.head.next = new_nodedef delete_node(self, i):"""刪除鏈表中第 i 個結點"""if i < 1:return Falsep = self.headj = 1while p and j < i:p = p.nextj += 1if not p or not p.next:return Falsetemp = p.nextp.next = temp.nextdel tempreturn Truedef print_list(self):"""打印鏈表"""p = self.head.nextwhile p:print(f" {p.data}", end="")p = p.nextprint()def main():# 輸入鏈表長度n = int(input())# 創建鏈表link_list = LinkList()link_list.create_list(n)# 輸入刪除位置i = int(input())# 刪除結點if link_list.delete_node(i):print(f"{n - 1}:", end="")else:print("錯誤:刪除位置不合法。")print(f"{n}:", end="")# 打印鏈表link_list.print_list()# 調用主函數
if __name__ == "__main__":main()
四、個人總結
通過本次單鏈表刪除元素的實驗,我深入理解了鏈表數據結構的基本原理和操作方法。在實驗過程中,我掌握了頭插法創建鏈表的技巧,認識到這種插入方式能夠實現O(1)時間復雜度的插入操作,但會使元素順序與輸入順序相反。在刪除指定位置節點時,我學會了如何通過遍歷找到目標節點的前驅節點,這是鏈表操作中的關鍵技巧。
實驗中遇到的難點主要是邊界條件的處理。當刪除位置不合法時,需要給出明確的錯誤提示,這讓我意識到健壯的程序必須考慮所有可能的異常情況。通過調試,我發現鏈表操作中特別需要注意指針的移動和空指針的判斷,稍有不慎就會導致程序崩潰或內存泄漏。
這次實踐還讓我體會到鏈表與數組的顯著差異。鏈表不需要預先分配連續內存空間,插入刪除效率高,但隨機訪問效率低。在輸出結果時,我注意到鏈表的遍歷輸出需要特別注意格式控制。通過實驗,我不但鞏固了理論知識,還提升了實際編程能力。特別是在指針操作和內存管理方面有了更深刻的認識。