链表(1)

192 阅读1分钟

移除重复结点

算法分析:(移除链表中的数据都应该使用哨兵来操作,这就使用cur.Next = cur.Next.Next就移除了)

  • 未排序链表,使用哨兵来操作
  • 使用map优化,将链表的值作为map的key,遍历每一个结点的值,如果不在map中,就加入到map里,如果在map中,说明此结点之前,已经有结点存在这个值,所以需将这个值删除。又因为使用了头结点,所以cur现在所指的结点的下一个才为此结点,调用cur.Next = cur.Next.Next 就移除了
  • 代码如下:
func removeDuplicateNodes(head *ListNode) *ListNode {
    m := make(map[int]int)
    headNode := &ListNode{Next:head}    
    cur := headNode
    for cur.Next != nil {
        nextv := cur.Next.Val   //因为使用了头结点,Next.Val才为结点的值
        if _, ok := m[nextv]; ok {
            cur.Next = cur.Next.Next
        } else {
            m[nextv]  = 1
            cur = cur.Next
        }
    }
    return head
}

移除排序好的结点

算法分析:

  • 不需要使用头结点,直接比较相邻元素,相同删除
func deleteDuplicates(head *ListNode) *ListNode {
    cur := head
    for cur != nil && cur.Next != nil {
        if cur.Val == cur.Next.Val {
            cur.Next = cur.Next.Next
        } else {
            cur = cur.Next
        }
    }
    return head
}