移除链表元素

一天一道算法题

Posted by AndyCao on September 8, 2019

题目

删除链表中等于给定值 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
}