删除排序链表中的重复元素II --链表

题目

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例1

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例2

输入: 1->1->1->2->3
输出: 2->3

思路

  • 新建新链表,创建newHead以及newCurrent分别是新链表的头部节点以及记录新链表当前值
  • 创建原链表pre指向虚拟头节点,以及current记录当前访问的值还有nextCurrent指向下一个元素
  • 以current是否为空判断,如果第一个元素的值与下一个元素不想等,可以将此节点插入到新链表中,并将指针向后移.

代码

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

func deleteDuplicates(_ head: ListNode?) -> ListNode? {
    if head?.next == nil {
        return head
    }
    var newHead: ListNode? //建立新链表的头部节点
    var newCurrent: ListNode? //新链接当前的值
    var pre: ListNode? //原链表的虚拟头节点
    var current: ListNode? = head //原链表当前访问的节点,默认第一个为头节点
    var nextCurrent: ListNode? = head?.next
    while current != nil {
        if pre?.val != current?.val, current?.val != nextCurrent?.val {
            //判断是否是新链表的第一个元素
            if newHead == nil {
                newHead = current
                newCurrent = current
            } else {
                newCurrent?.next = current
                newCurrent = current
            }
        }
        pre = current
        current = nextCurrent
        nextCurrent = current?.next
    }
    newCurrent?.next = current
    return newHead
}

上面代码有注释

结果

大家可以在playground中敲击代码,提高自己的编程能力!!!

猜你喜欢

转载自www.cnblogs.com/guohai-stronger/p/11927869.html