移除重复结点
算法分析:(移除链表中的数据都应该使用哨兵来操作,这就使用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
}