237. 删除链表中的节点

image.png
image.png

删除一个节点,需要获取前一个节点的信息

  1. func deleteNodeByHead(head,node *ListNode)*ListNode {
  2. dummyHead :=&ListNode{
  3. Val: -1,
  4. Next: head,
  5. }
  6. var pre = dummyHead
  7. for head!=nil{
  8. if head.Val==node.Val {
  9. next := node.Next
  10. pre.Next = next
  11. head = next
  12. }else {
  13. pre = head
  14. head = head.Next
  15. }
  16. }
  17. return dummyHead.Next
  18. }
  19. func main() {
  20. head :=&ListNode{Val:4}
  21. n1 :=&ListNode{Val:5}
  22. head.Next = n1
  23. n2 :=&ListNode{Val:1}
  24. n1.Next = n2
  25. n2.Next =&ListNode{Val:9}
  26. curr:= deleteNodeByHead(head,n1)// 去掉5个节点
  27. for curr != nil{
  28. fmt.Println(curr.Val)
  29. curr = curr.Next
  30. }
  31. }

但是这个只有输入参数只有一个当前要删除的节点信息,解决方式有点取巧,就是把下一个节点的值干掉,先把下一个节点的值复制到当前节点

  1. type ListNode struct {
  2. Val int
  3. Next *ListNode
  4. }
  5. // 无法获取前置节点 只能把下一个节点干掉 ,然后把一个节点的值复制给当前节点
  6. func deleteNode(node *ListNode) {
  7. next := node.Next// 当前的下一个节点
  8. node.Val = next.Val // 替换值
  9. node.Next = next.Next //让当前节点指向的是下一个节点的下一个
  10. }
  11. func main() {
  12. head :=&ListNode{Val:4}
  13. n1 :=&ListNode{Val:5}
  14. head.Next = n1
  15. n2 :=&ListNode{Val:1}
  16. n1.Next = n2
  17. n2.Next =&ListNode{Val:9}
  18. deleteNode(n1)// 去掉5个节点
  19. curr :=head
  20. for curr != nil{
  21. fmt.Println(curr.Val)
  22. curr = curr.Next
  23. }
  24. }

image.png