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