連結串列專題
1、連結串列
連結串列有單連結串列,雙連結串列,環形連結串列;連結串列主要功能是將離散的地址通過指標連線起來。
2、模板
連結串列相對比較靈活,無具體的模板可以套用;可以考慮如下幾點
2.1、新建連結串列時,可以引入一個哨兵節點head=Node(-1),返回head.next;簡化操作
2.2、環、刪除第k個節點,均可使用快慢指標
3.3、修改下一個指向時,先備份,以免節點丟失
3、例項
19. 刪除連結串列的倒數第N個節點
難度:中等
題目描述
給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。
示例 1:
給定一個連結串列: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
解題思路
- 快慢指標
- 刪除後,空指標問題。
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
# 防止,刪除變為空指標。
_ = ListNode(0)
_.next = head
# 快慢指標。
slow, fast = _ , _
# 快指標,後移n個節點。
for i in range(n):
fast = fast.next
# 同時移動快慢指標。當快指標到末尾時,慢指標正好在倒數第n-1個節點位置。
while (fast is not None) and (fast.next is not None) :
fast = fast.next
slow = slow.next
# 刪除目標節點
slow.next = slow.next.next
return _.next
24. 兩兩交換連結串列中的節點
難度:中等
題目描述
給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 返回 2->1->4->3.
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
dummyHead = ListNode(0)
dummyHead.next = head
temp = dummyHead
while temp.next and temp.next.next:
node1 = temp.next
node2 = temp.next.next
temp.next = node2
node1.next = node2.next
node2.next = node1
temp = node1
return dummyHead.next
25. K 個一組翻轉連結串列
難度:中等
題目描述
給你一個連結串列,每 k 個節點一組進行翻轉,請你返回翻轉後的連結串列。
k 是一個正整數,它的值小於或等於連結串列的長度。
如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。
示例:
給你這個連結串列:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
class Solution:
# 翻轉一個子連結串列,並且返回新的頭與尾
def reverse(self, head: ListNode, tail: ListNode):
prev = tail.next
p = head
while prev != tail:
nex = p.next
p.next = prev
prev = p
p = nex
return tail, head
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
hair = ListNode(0)
hair.next = head
pre = hair
while head:
tail = pre
# 檢視剩餘部分長度是否大於等於 k
for i in range(k):
tail = tail.next
if not tail:
return hair.next
nex = tail.next
head, tail = self.reverse(head, tail)
# 把子連結串列重新接回原連結串列
pre.next = head
tail.next = nex
pre = tail
head = tail.next
return hair.next
相關文章
- LeetCode連結串列專題LeetCode
- 連結串列專題——面試中常見的連結串列問題面試
- 單連結串列建立連結串列出現問題
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- 連結串列(LinkedList)解題總結
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列
- 連結串列 - 單向連結串列
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 連結串列反轉問題
- 2024/12/1 【連結串列】 LeetCode 面試題 02.07. 連結串列相交LeetCode面試題
- 【連結串列問題】刪除單連結串列的中間節點
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現
- 連結串列-雙向通用連結串列
- 連結串列-雙向非通用連結串列
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- 連結串列入門與插入連結串列
- Leetcode_86_分割連結串列_連結串列LeetCode
- 反轉連結串列系列問題
- 單連結串列的排序問題排序
- leetcode題目解析(js)--連結串列LeetCodeJS
- 尋找連結串列相交結點問題
- 資料結構連結串列筆試題資料結構筆試
- 資料結構-單連結串列、雙連結串列資料結構
- 連結串列
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- LeetCode-Python-86. 分隔連結串列(連結串列)LeetCodePython
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點
- 演算法題中的連結串列演算法
- [每日一題] 第二題:反轉連結串列每日一題
- **203.移除連結串列元素****707.設計連結串列****206.反轉連結串列**
- 演算法題:反轉一個單連結串列&判斷連結串列是否有環演算法
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 連結串列逆序
- 2、連結串列