鏈表(LinkedList)
- 單鏈表:鏈表中的每個元素實際上是一個單獨的對象,而所有對象都通過每個元素中的引用字段鏈接在一起。
- 雙鏈表:與單鏈表不同的是,雙鏈表的每個結點中都含有兩個引用字段。
鏈表的優點如下:
- 鏈表能靈活地分配內存空間;
- 能在 O(1) 時間內刪除或者添加元素,前提是該元素的前一個元素已知,當然也取決於是單鏈表還是雙鏈表,在雙鏈表中,如果已知該元素的后一個元素,同樣可以在 O(1) 時間內刪除或者添加該元素。
鏈表的缺點是:
- 不像數組能通過下標迅速讀取元素,每次都要從鏈表頭開始一個一個讀取;
- 查詢第 k 個元素需要 O(k) 時間。
示例:
給定這個鏈表:1->2->3->4->5
當 k=2 時,應當返回:2->1->4->3->5
當 k=3 時,應當返回:3->2->1->4->5
在翻轉鏈表的時候,可以借助三個指針:prev、curr、next,分別代表前一個節點、當前節點和下一個節點,實現過程如下所示。
class Solution: def reverseKGroup(self, head, ListNode, k: int): l = 0 heads = ListNode(0) ans = heads ls = head while (ls != None): l = l + 1 ls = ls.next while (head != None): if l >= k: pre = head st = head for i in range(k): st = st.next new = ListNode(0) new.next = st for i in range(k): last = head.next head.next = new.next new.next = head head = last ans.next = new.next ans = pre l -= k else: ans.next = head break return heads.next