給定單向鏈表的頭指針和一個要刪除的節點的值,定義一個函數刪除該節點。
返回刪除後的鏈表的頭節點。
注意:此題對比原題有改動;題目保證鏈表中節點的值互不相同
示例 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)