victory的博客

长安一片月,万户捣衣声

0%

leetcode | 83.删除有序链表中的重复元素

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)