删除排序链表中的重复元素
思路:
遍历链表,用一个指针指向当前节点的上一个节点,遇到重复节点时,上一个节点指向当前节点的下一个节点
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
}