鍊錶是最簡單的資料結構之一,包括單向鍊錶、雙向鍊錶、迴圈鍊錶。
每條鍊錶都由一系列節點(node)組成,節點包括兩部分:資料元素的值(value)和指向下乙個節點的指標(next)。
相比陣列,鍊錶可以更加靈活的儲存資料,不需要知道要儲存的資料有多少,這樣可以充分利用計算機的記憶體空間。鍊錶可以再任意位置插入或刪除資料,但是不允許隨意讀取資料。
在python3中定義乙個鍊錶資料結構:
class
listnode
:def
__init__
(self, data)
: self.value = data
self.
next
=none
問題描述:給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思考:這裡會出現兩個問題
(1)兩個鍊錶不一樣長(包括乙個鍊錶是空鍊錶的情況)
(2)最後會出現進製
解決方法:
class
solution
:def
addtwonumbers
(self, l1: listnode, l2: listnode)
-> listnode:
listnode_1 = l1
listnode_2 = l2
listnode_3 = listnode(0)
listnode_3_copy = listnode_3
carry =
0while
(listnode_1 or listnode_2)
:#解決第乙個問題
#在迴圈過程中,如果兩個鍊錶中有乙個為空,那就賦值為0
num_1 = listnode_1.val if listnode_1 else
0 num_2 = listnode_2.val if listnode_2 else
0#當前節點相加的結果是兩個鍊錶節點的值和進製值進行加和
value = num_1 + num_2 + carry
#由於存在head節點,所以相加結果要將個位上的數字存在結果鍊錶的下乙個節點中
#並將相加結果的十位上的數字賦值給進製變數carry
listnode_3_copy.
next
= listnode(value %10)
carry = value //
10#當前節點計算後,要將鍊錶節點轉到下乙個節點上
#如果有乙個鍊錶為空,就賦值為0
if listnode_1 !=
none
: listnode_1 = listnode_1.
next
if listnode_2 !=
none
: listnode_2 = listnode_2.
next
#將結果鍊錶的節點轉到下一節點處
listnode_3_copy = listnode_3_copy.
next
#解決第二個問題
#判斷兩個鍊錶最後乙個節點相加後是否存在進製的情況,如果有就將進製值賦給結果鍊錶的下乙個節點
if carry !=0:
listnode_3_copy.
next
= listnode(carry)
#返回結果鍊錶
return listnode_3.
next
鍊錶操作練習
本小題請務必重視,綜合了各種鍊錶操作 各種考試考題 可以做成乙個比較完整的工程,請設計測試程式進行測試,務必自己編寫 1 針對帶表頭結點的單鏈表,試編寫下列函式。1 建立函式create 根據一維陣列a n 建立乙個單鏈表,使單鏈表中各元素的次序與a n 中各元素的次序相同,要求該程式的時間複雜性為...
鍊錶例題練習
例題描述 將鍊錶中值小於x的節點放在鍊錶的前面,值大於等於x的節點放在鍊錶的後半部分。class listnode public listnode int val public class linkedlistinterview else send cur send指向cur所指的物件,當send指...
單向鍊錶練習
分析 當鍊表的頭節點是無效資料時 頭節點的next指標指向null,則表明此煉表無有效值 頭節點的next指標指向不為null時,則對鍊錶進行遍歷,統計其有效資料個數 獲取鍊錶長度 return public intgetvalidlength heronode temp head.next whi...