移除链表元素--链表
题目
删除链表中等于给定值 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 }
解法二: 递归
思想
-
首先判断链表是否为空
-
递归removeElements(head?.next, val)判断值
-
返回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 } }
结果