1. 程式人生 > >[劍指Offer] 18_刪除連結串列的節點_01

[劍指Offer] 18_刪除連結串列的節點_01

題目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


思路

  1. 關鍵在於要求O(1)的時間,所以不可以從頭遍歷。這個題目在leetcode做過,當時還是想了很久。其實並沒有刪除了節點,而是刪除了節點的值,想到這一層,就能明白這個題目的解法。沒有刪除node的記憶體,而是將node中儲存的資料刪除了,因此只需要將node.next.val賦值給node.val,並刪除node.next即可。
    注意,處理node.next = None的情況,不然會報錯None沒有val屬性。此時必須處理前一節點的next屬性,只能從頭遍歷。
    注意,處理刪除的節點時頭節點,且連結串列中只有這個節點的情況。Python我不知道如何原地刪除頭節點…只能做返回None處理,其餘情況返回head。
    1. 時間複雜度:平均O(1)
    2. 空間複雜度: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