返回

Swift LeetCode:巧妙移除链表指定元素,算法解题轻松搞定

IOS

在浩瀚的代码世界中,LeetCode 犹如一座拔地而起的山峰,吸引着无数程序员前来挑战。本篇博文将带你踏上 Swift LeetCode 征途,直面「移除链表元素」这一经典难题,为你揭开算法解题的奥秘。

算法设计

本题的关键在于遍历链表,找出并移除所有满足特定值的节点。为此,我们可以采用以下算法:

  1. 创建一个哨兵节点,指向链表的头部。哨兵节点用于简化代码,避免处理链表为空或第一个节点即为目标值的情况。
  2. 使用两个指针:prev 指向当前节点的前一个节点,curr 指向当前节点。
  3. 遍历链表,如果 curr 的值等于目标值,则跳过该节点,将 prev 的 next 指向 curr 的 next。
  4. 如果 curr 的值不等于目标值,则将 prevcurr 指针都向后移动一位。
  5. 遍历结束后,返回哨兵节点的 next,即修改后的链表头部。

代码实现

func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
    guard let head = head else { return nil }

    // 创建哨兵节点
    let dummy = ListNode(0, head)

    // 初始化指针
    var prev = dummy
    var curr = head

    while curr != nil {
        if curr!.val == val {
            // 移除当前节点
            prev.next = curr!.next
        } else {
            // 移动指针
            prev = curr!
        }
        curr = curr!.next
    }

    // 返回修改后的链表头部
    return dummy.next
}

实例

假设链表为:[1, 2, 6, 3, 4, 5, 6],目标值为 6。经过算法处理后,链表将变为:[1, 2, 3, 4, 5]

总结

通过这篇博文,我们共同探索了 Swift LeetCode 中「移除链表元素」的解题思路和代码实现。希望各位读者能够从中领悟算法设计的精髓,提升自己的编程技能。如果你有任何疑问或建议,欢迎在评论区留言交流。

扩展阅读