移除链表元素--链表

题目

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

 

解法一

思路

1.  首先判断链表是否为空以及链表的第一个节点是不是等于val(该删除的节点),循环遍历到第一个不等于val的节点

2.  以p.next判断节点是否为空,然后判断p.next.val == val 

    如果相等,则指向p.next 的下一个节点 p.next = p.next?.next

    如果不相等,则将元素后移,继续判断 p = p.next!

3.  返回head,完成操作

 

代码

public class ListNode {
    public var val: Int
    public var next: ListNode?
    public init (_ val: Int) {
        self.val = val
        self.next = nil
    }
}

func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
    var head = head //swift中传值为let不可变,所以转为var可变
    while head != nil && head?.val == val {
        head = head?.next
    }
    if head == nil {
        return head
    }
    var p: ListNode = head!
    while p.next != nil {
        if p.next?.val == val {
            p.next = p.next?.next
        } else {
            p = p.next!
        }
    }
    return head
}

 

解法二: 递归

思想

  1. 首先判断链表是否为空

  2. 递归removeElements(head?.next, val)判断值

  3. 返回head,完成操作

 

代码

public class ListNode {
    public var val: Int
    public var next: ListNode?
    public init (_ val: Int) {
        self.val = val
        self.next = nil
    }
}

func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
    let head = head //swift中传值为let不可变,所以转为var可变
    if head == nil {
        return head
    }
    head?.next = removeElements(head?.next, val)
    if head?.val == val {
        return head?.next
    } else {
        return head
    }
}

 

结果

 

posted @ 2019-12-02 15:17  国孩  阅读(334)  评论(0编辑  收藏  举报