劍指offer:刪除鏈表的節點
阿新 • • 發佈:2019-04-22
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:刪除鏈表的節點