1. 程式人生 > >劍指offer:刪除鏈表的節點

劍指offer:刪除鏈表的節點

time () class 改變 sel ted while 賦值 none

# -*- coding: utf-8 -*- # @Time : 2019-04-19 21:21 # @Author : Jayce Wong # @ProjectName : job # @FileName : deleteNode.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJayce # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None def deleteNode1(head, toBeDeleted): """ 普通的遍歷,復雜度為O(n) """ if not head or not toBeDeleted: return if head == toBeDeleted: # 如果待刪除節點就是頭節點,那麽就直接刪除頭節點即可 return head.next # 維護一個指針,目的是找到待刪除節點的前一個節點,因此我們遍歷整個鏈表,如果當前節點的下一個 # 節點就是待刪除節點,說明當前節點就是待刪除節點的前一個節點,我們直接將當前節點和待刪除節點 # 的下一個節點連接起來即可 temp = head while temp.next: if temp.next == toBeDeleted: temp.next = toBeDeleted.next break temp = temp.next return head def deleteNode(head, toBeDeleted): """ 在O(1)時間內刪除鏈表中的某個節點,由於需要在O(1)時間內刪除鏈表中的某個節點,那麽判斷 toBeDeleted這個節點是否在鏈表內的任務就無法完成,需要調用者來判斷。 """ if not head or not toBeDeleted: return if head == toBeDeleted: # 待刪除的節點是頭節點 return head.next # 待刪除的節點是尾節點,由於我們直接將toBeDeleted置為None無法真正改變鏈表中的節點,因此需要 # 順序查找,這種情況下的時間復雜度為O(n) if not toBeDeleted.next: temp = head while temp.next: if temp.next == toBeDeleted: temp.next = toBeDeleted.next break temp = temp.next # 待刪除的節點是中間節點,直接將下一個節點的值賦值給待刪除節點,然後將待刪除節點和下下個節點 # 連接起來,相當於是把待刪除節點給刪除了(因為我們把待刪除節點的下一個節點的值賦給了待刪除節點) else: toBeDeleted.val = toBeDeleted.next.val toBeDeleted.next = toBeDeleted.next.next return head def main(): zero = ListNode(0) one = ListNode(1) two = ListNode(2) three = ListNode(3) four = ListNode(4) zero.next = one one.next = two two.next = three three.next = four phead = deleteNode(four, four) while phead: print(phead.val) phead = phead.next if __name__ == ‘__main__‘: main()

劍指offer:刪除鏈表的節點