JZ56 删除链表中重复的结点

删除链表中重复的结点

题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路:

由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。由于链表的头节点可能会被删除,因此我们需要额外使用一个哑节点(dummy node)指向链表的头节点。

具体地,我们从指针 extit{cur}cur 指向链表的哑节点,随后开始对链表进行遍历。如果当前 extit{cur.next}cur.next 与 extit{cur.next.next}cur.next.next 对应的元素相同,那么我们就需要将 extit{cur.next}cur.next 以及所有后面拥有相同元素值的链表节点全部删除。我们记下这个元素值 xx,随后不断将 extit{cur.next}cur.next 从链表中移除,直到 extit{cur.next}cur.next 为空节点或者其元素值不等于 xx 为止。此时,我们将链表中所有元素值为 xx 的节点全部删除。

如果当前 extit{cur.next}cur.next 与 extit{cur.next.next}cur.next.next 对应的元素不相同,那么说明链表中只有一个元素值为 extit{cur.next}cur.next 的节点,那么我们就可以将 extit{cur}cur 指向 extit{cur.next}cur.next。

当遍历完整个链表之后,我们返回链表的的哑节点的下一个节点 extit{dummy.next}dummy.next 即可

func deleteDuplication(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }

    dummy := &ListNode{
        0,
        head,
    }
    head = dummy

    for head.Next != nil && head.Next.Next != nil {
        if head.Next.Val == head.Next.Next.Val {
            flag := head.Next.Val
            for head.Next != nil && head.Next.Val == flag{
                head.Next = head.Next.Next
            }
        } else {
            head = head.Next
        }
    }

    return dummy.Next
}
 
原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14642563.html