給定單向鏈表的頭指針和一個(gè)要?jiǎng)h除的節(jié)點(diǎn)的值,定義一個(gè)函數(shù)刪除該節(jié)點(diǎn)。返回刪除后的鏈表的頭節(jié)點(diǎn)。(此題對(duì)比原題有改動(dòng))
刪除鏈表節(jié)點(diǎn),首先就要想到單鏈表的特性,next指針指向下一個(gè)節(jié)點(diǎn),所以就考慮到雙指針,一個(gè)指針尋找要?jiǎng)h除的節(jié)點(diǎn),一個(gè)指向前一個(gè)指針之前的節(jié)點(diǎn),找到后可以將后一個(gè)指針的next 指向 前一個(gè)指針的next。代碼自然而然就有如下:
func deleteNode(_ head: ListNode?, _ val: Int) -> ListNode? {
guard head != nil else {
return nil
}
if head!.val == val {
return head?.next
}
var fast = head?.next
var slow = head
while fast != nil {
if fast!.val == val {
slow?.next = fast?.next
return head
}else {
fast = fast?.next
slow = slow?.next
}
}
return nil
}
還有一種遞歸算法:
func deleteNode(_ head: ListNode?, _ val: Int) -> ListNode? {
guard head != nil else {
return nil
}
if head!.val == val {
return head?.next
}
head?.next = deleteNode(head?.next, val)
return head
}