[劍指Offer] 18_刪除連結串列的節點_01
阿新 • • 發佈:2019-01-13
題目1:在O(1)的時間內刪除連結串列節點。
題目:給定單向連結串列的頭指標和一個節點指標,定義一個函式在O(1)時間內刪除該節點。
連結串列節點定義如下:
class ListNode(object):
def __init__(self, val):
self.val = val
self.next = None
例:
1 -> 2 -> 3 ->4 -> None
head = 1 del = 3
1 -> 2 -> 4
思路
- 關鍵在於要求O(1)的時間,所以不可以從頭遍歷。這個題目在leetcode做過,當時還是想了很久。其實並沒有刪除了節點,而是刪除了節點的值,想到這一層,就能明白這個題目的解法。沒有刪除node的記憶體,而是將node中儲存的資料刪除了,因此只需要將node.next.val賦值給node.val,並刪除node.next即可。
注意,處理node.next = None的情況,不然會報錯None沒有val屬性。此時必須處理前一節點的next屬性,只能從頭遍歷。
注意,處理刪除的節點時頭節點,且連結串列中只有這個節點的情況。Python我不知道如何原地刪除頭節點…只能做返回None處理,其餘情況返回head。- 時間複雜度:平均O(1)
- 空間複雜度:O(1)
程式碼
class ListNode(object):
def __init__(self, val):
self.val = val
self.next = None
def delete_ListNode(head, delete_node):
"""
:param head: head of NodeList
:param delete_node: node
:return: head
"""
next_node = delete_node. next
if next_node:
# not del end
delete_node.val, next_node.val = next_node.val, delete_node.val
delete_node.next = next_node.next
elif head is not delete_node:
# del end
while head.next is not delete_node:
head = head.next
head.next = None
else:
# delete head
head = None
return head
思考
Leetcode 237. 刪除連結串列中的節點
題目
請編寫一個函式,使其可以刪除某個連結串列中給定的(非末尾)節點,你將只被給定要求被刪除的節點。
現有一個連結串列 – head = [4,5,1,9],它可以表示為:
4 -> 5 -> 1 -> 9
示例 1:
輸入: head = [4,5,1,9], node = 5
輸出: [4,1,9]
解釋: 給定你連結串列中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該連結串列應變為 4 -> 1 -> 9.
示例 2:
輸入: head = [4,5,1,9], node = 1
輸出: [4,5,9]
解釋: 給定你連結串列中值為 1 的第三個節點,那麼在呼叫了你的函式之後,該連結串列應變為 4 -> 5 -> 9.
說明:
連結串列至少包含兩個節點。
連結串列中所有節點的值都是唯一的。
給定的節點為非末尾節點並且一定是連結串列中的一個有效節點。
不要從你的函式中返回任何結果。
程式碼
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next