zoukankan      html  css  js  c++  java
  • 删除排序链表中的重复元素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中敲击代码,提高自己的编程能力!!!

  • 相关阅读:
    LinkedList类源码浅析(一)
    ArrayList类源码浅析(三)
    我谁也没等,因为谁也不会来
    维持一段友谊
    最甜美的悲伤
    小美人访谈录笔记[1]
    1984我想对这个世界说些什么
    我喜欢我
    等不来的始终等不来,无须报以希望
    我抱有怀疑
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11927869.html
Copyright © 2011-2022 走看看