面试题 02.01. 移除重复节点

image.png
1 hash记录每个节点的值 ,主要去重用途
2 创建哨兵节点作为前置节点
3 当重复值出现 需要去掉这个节点 pre.Next = head.Next
4 链表做好的理解方式 是自己动手手绘一下节点关系,如何去掉重复节点,不要自己无聊的空间想象。

  1. package main
  2. import "fmt"
  3. type ListNode struct {
  4. Val int
  5. Next *ListNode
  6. }
  7. func removeDuplicateNodes1(head *ListNode) *ListNode {
  8. m :=make(map[int]struct{})
  9. dummyHead :=&ListNode{Val:-1}
  10. pre :=dummyHead
  11. for head!=nil{
  12. if _,ok:=m[head.Val];!ok{
  13. m[head.Val] = struct{}{}
  14. pre.Next = head
  15. pre = head
  16. }else {
  17. pre.Next = head.Next
  18. }
  19. head = head.Next
  20. }
  21. return dummyHead.Next
  22. }
  23. func removeDuplicateNodes(head *ListNode) *ListNode {
  24. m :=make(map[int]struct{})
  25. dummyHead :=&ListNode{Next:head}
  26. curr :=dummyHead
  27. for curr!=nil&&curr.Next!=nil{
  28. val :=curr.Next.Val
  29. if _,ok:=m[val];ok{
  30. curr.Next = curr.Next.Next
  31. }else {
  32. m[val] = struct{}{}
  33. curr = curr.Next
  34. }
  35. }
  36. return dummyHead.Next
  37. }
  38. func main() {
  39. n1 :=&ListNode{Val:1}
  40. n2 :=&ListNode{Val:2}
  41. n1.Next = n2
  42. n3 :=&ListNode{Val:3}
  43. n2.Next = n3
  44. n4 :=&ListNode{Val:3}
  45. n3.Next = n4
  46. n5 :=&ListNode{Val:2}
  47. n4.Next = n5
  48. n6:=&ListNode{Val:1}
  49. n5.Next = n6
  50. h :=removeDuplicateNodes1(n1)
  51. for h!=nil{
  52. fmt.Println(h.Val)
  53. h=h.Next
  54. }
  55. }

image.png