题目
删除链表中等于给定值 val 的所有节点。 示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
输入: 1->1 val = 1
输出: nil
定义节点
class ListNode {
public var val: Int
public var next: ListNode?
public init(_ val: Int) {
self.val = val
self.next = nil
}
}
解法1:删除头节点时,需做处理
func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
if head == nil {
return head
}
var newHead = head
//删除值相同的头节点后,可能新的头节点也值相等,用循环解决
while newHead?.val == val {
newHead = newHead?.next
}
var cur = newHead
// 确保当前节点后还有节点
while cur?.next != nil {
let next = cur?.next
if next?.val == val {
cur?.next = next?.next
}
else {
cur = next
}
}
return newHead
}
解法2:虚拟头节点
有时候为了让代码更加精简,统一所有节点的处理逻辑,可以在最前面增加一个虚拟的头结点
func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
// 创建一个虚拟头节点
let virtualHead = ListNode(val - 1)
virtualHead.next = head
var cur = virtualHead
// 确保当前结点后还有节点
while cur.next != nil {
let next = cur.next
if next?.val == val {
cur.next = next?.next
}
else {
cur = next!
}
}
return virtualHead.next
}