面试题22. 链表中倒数第k个节点

图片.png

  1. package main
  2. import "fmt"
  3. type ListNode struct {
  4. Val int
  5. Next *ListNode
  6. }
  7. func getKthFromEnd1(head *ListNode, k int) *ListNode {
  8. var res []*ListNode
  9. for head != nil {
  10. res = append(res, head)
  11. head = head.Next
  12. }
  13. l := len(res)
  14. if l >= k {
  15. return res[l-k]
  16. }
  17. return nil
  18. }
  19. func getKthFromEnd(head *ListNode, k int) *ListNode {
  20. var fast = head
  21. for k > 0 && fast != nil {
  22. fast = fast.Next
  23. k--
  24. }
  25. var slow = head
  26. for fast != nil {
  27. fast = fast.Next
  28. slow = slow.Next
  29. }
  30. return slow
  31. }
  32. func main() {
  33. one := &ListNode{Val: 1}
  34. two := &ListNode{Val: 2}
  35. one.Next = two
  36. three := &ListNode{Val: 3}
  37. two.Next = three
  38. four := &ListNode{Val: 4}
  39. three.Next = four
  40. five := &ListNode{Val: 5}
  41. four.Next = five
  42. r := getKthFromEnd(one, 2)
  43. for r != nil {
  44. fmt.Println(r.Val)
  45. r = r.Next
  46. }
  47. }

图片.png