方法一:双指针

思路:采用保持距离的双指针

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func removeNthFromEnd(head *ListNode, n int) *ListNode {
  9. dummyNode := &ListNode{}
  10. dummyNode.Next = head
  11. //删除倒数第n个节点我们需要保持n+1的距离
  12. fast, slow := dummyNode, dummyNode
  13. for i := 0; i < n+1; i++ {
  14. //如果n越界,直接返回空
  15. if fast == nil {
  16. return dummyNode.Next
  17. }
  18. fast = fast.Next
  19. }
  20. for fast != nil {
  21. fast, slow = fast.Next, slow.Next
  22. }
  23. //此时slow指向倒数第n个节点的前1个节点
  24. slow.Next = slow.Next.Next
  25. return dummyNode.Next
  26. }