更多算法常识,请关注公众号《程序员学长》
删除有序链表中反复的元素-II
问题形容
LeetCode 82. 删除排序链表中的反复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字反复状况的节点,只保留原始链表中没有反复呈现的数字。返回同样按升序排列的后果链表。
示例:
输出:head = [1,2,3,3,4,5]
输入:[1,2,5]
剖析问题
因为给定的链表是有序的,所以链表中反复的元素在地位上必定是相邻的。因而,咱们能够对链表进行一次遍历,就能够删除反复的元素。
这里须要留神一点,因为可能会删除头结点head,咱们引入了一个哨兵节点dummy,让dummy.next=head,这样即便head被删除了,那么也会操作dummy.next指向新的链表头结点,所以最终返回dummy.next即可。
首先,咱们让cur指针指向链表的哨兵节点,而后开始对链表进行遍历。如果cur.next与cur.next.next对应的元素值雷同,那么咱们就须要将cur.next以及前面所有值雷同的链表节点全副删除,直到cur.next为空节点或者其元素值与其不同。如果cur.next与cur.next.next对应的元素值不雷同,那么咱们就能够将cur 指向 cur.next。
上面咱们来看一下代码的实现。
class Solution:
def deleteDuplicates(self, head):
#如果链表为空,间接返回
if not head:
return head
#创立一个哨兵节点
dummy = ListNode(0)
dummy.next=head
#开始时,将cur指向哨兵节点
cur = dummy
while cur.next and cur.next.next:
#如果cur.next.val和cur.next.next.val雷同,删除反复元素
if cur.next.val == cur.next.next.val:
data = cur.next.val
while cur.next and cur.next.val == data:
cur.next = cur.next.next
else:
cur = cur.next
return dummy.next
该算法的工夫复杂度是O(n),空间复杂度是O(1)。
发表回复