删除排序链表的重复元素

18 阅读1分钟

删除排序链表中的重复元素

思路:

遍历链表,用一个指针指向当前节点的上一个节点,遇到重复节点时,上一个节点指向当前节点的下一个节点

func deleteDuplicates(head *ListNode) *ListNode {
	myMap := make(map[int]int)
	preNode := &ListNode{}
	preNode.Next = head
	node := head
	for node != nil {
		if _, ok := myMap[node.Val]; !ok {
			//不存在,加入
			myMap[node.Val] = 1
			preNode = preNode.Next
		} else {
			//前指针指向下一个节点。存在,
			preNode.Next = node.Next
			//注意,因为删除了一个节点,这里前指针不能再往前移了,否则会跟现指针重复
		}
		node = node.Next
	}
	return head
}

遍历链表,创建一个新链表,记录元素,不重复就添加

func deleteDuplicates(head *ListNode) *ListNode {
    myMap := make(map[int]int)
    newHead := &ListNode{} //新链表的头节点
    newNode := newHead
    node := head
    for node != nil {
        if _, ok := myMap[node.Val]; !ok {
            //不存在,加入
            myMap[node.Val] = 1
            newNode.Next = &ListNode{Val: node.Val}
            //注意,不要忘了新节点next
            newNode = newNode.Next
        }
        node = node.Next
    }
    return newHead.Next
}

我上面的这两种方法,对于删除普通链表的重复元素好使,但是注意,这里有限定条件,已排序链表,只需要比较当前节点与下一节点的值即可,更简单

func deleteDuplicates(head *ListNode) *ListNode {
	node := head
	for node != nil {
		//if node.Val == node.Next.Val {
		//	//这里应该检查是否与下一个的下一个节点值重复,一步到底
		//	node.Next = node.Next.Next
		//}
		nextNode := node.Next
		for nextNode != nil && node.Val == nextNode.Val {
			nextNode = nextNode.Next
		}
		node.Next = nextNode
		node=node.Next
	}
	return head
}