83.删除有序链表中的重复元素
题目描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
思路
一次遍历法
由于链表是按照升序排序的链表,所有重复的元素是相邻的,我们只需遍历一次链表,并判断当前节点与当前节点的后一节点所对应元素是否相等,
如果相等则将后者删除,如果不相等,工作指针继续后移,…,以此类推,当遍历完整个链表之后,我们返回链表的头节点即可。
代码
# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
def deleteDuplicates(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# prev = head
# p = prev.next
#
# while p is not None: #
# if prev.val == p.val:
# p = p.next
# prev.next = p
# else:
# prev = prev.next
# p = p.next
#
# return head
if not head:
return head
cur = head
while cur.next:
if cur.val == cur.next.val:
cur.next = cur.next.next
else:
cur = cur.next
return head
def create_linked_list(self, list):
"""根据list中的所有元素构建单链表"""
l = ListNode() # 单链表头节点
r = l # 起始尾指针r指向头节点
for e in list:
node = ListNode(e)
r.next = node
r = r.next
return l.next
def print_linked_list(self, linked_list) -> None:
"""
打印单链表中的所有元素
:param linked_list: 单链表
:return: 无
"""
print("----------------------------------------")
pointer = linked_list
while pointer is not None:
print(pointer.val)
pointer = pointer.next
if __name__ == "__main__":
slt = Solution()
l1 = slt.create_linked_list([1, 1, 2, 3, 3])
l = slt.deleteDuplicates(l1)
slt.print_linked_list(l)