删除链表中重复的结点
题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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 }