面試題18 刪除鏈表中的節點 單指針/雙指針 Python3

給定單向鏈表的頭指針和一個要刪除的節點的值,定義一個函數刪除該節點。

返回刪除後的鏈表的頭節點。

注意:此題對比原題有改動;題目保證鏈表中節點的值互不相同

示例 1:

輸入: head = [4,5,1,9], val = 5
輸出: [4,1,9]
解釋: 給定你鏈表中值爲 5 的第二個節點,那麼在調用了你的函數之後,該鏈表應變爲 4 -> 1 -> 9.
示例 2:

輸入: head = [4,5,1,9], val = 1
輸出: [4,5,9]
解釋: 給定你鏈表中值爲 1 的第三個節點,那麼在調用了你的函數之後,該鏈表應變爲 4 -> 5 -> 9.

 

這個題需要刪除節點並改變鏈表的連接,且是單向鏈表,因此需要設置指針。可以設置但指針也可以設置雙指針。

方法1 雙指針

思路

既然要刪除節點,那麼主要有兩步:

1. 定位:遍歷列表,直到出現(當前節點的值==value)或(遍歷完成);

2. 刪除:因爲是單向列表,所以要設置指針。對於雙指針pre和cur,設其連接關係爲pre-->cur-->cur.next,;則若cur是需要刪除的節點,則只需要pre.next = cur.next即可。

遍歷過程只需要pre ,cur = cur, cur.next

代碼

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def deleteNode(self, head: ListNode, val: int) -> ListNode:
        if head.val == val:     # specific situation, return directly
            return head.next
        pre ,cur = head, head.next
        while(cur):
            if cur.val == val:  # find node
                # delete node
                pre.next = cur.next
                break
            # update
            pre, cur = cur, cur.next
        return head

 

方法2 單指針

思路

思路與方法1類似

1. 定位:遍歷列表,直到出現(當前節點的值==value)或(遍歷完成);

2. 刪除:因爲是單向列表,所以要設置指針。對於單指針cur,設其連接關係爲cur-->cur.next-->cur.next.next,;則若cur.next是需要刪除的節點,則只需要xur.next = cur.next.next即可。

代碼

class Solution:
    def deleteNode(self, head: ListNode, val: int) -> ListNode:
        if head.val == val:     # specific situation, return directly
            return head.next
        cur = head
        while(cur):
            if cur.next.val == val:    # localization
                cur.next = cur.next.next    # delete
                break                  # return directly
            cur = cur.next             # next node
        return head

結果

 

總結

兩種方法的時間複雜度均爲O(N);

空間複雜度均爲O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章