一、使用循环

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val, next) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.next = (next===undefined ? null : next)
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {ListNode}
  11. */
  12. var reverseList = function(head) {
  13. if(!head || !head.next) {
  14. return head
  15. }
  16. let pre = null
  17. let cur = head
  18. let tmp = head.next
  19. while(cur) {
  20. cur.next = pre
  21. pre = cur
  22. cur = tmp
  23. tmp = cur && cur.next
  24. }
  25. return pre
  26. };

二、使用递归

  1. /**
  2. * @param {ListNode} head
  3. * @param {ListNode} p
  4. * @return {ListNode}
  5. */
  6. var reverseList = function(head, p = null) {
  7. if (!head.value) return head
  8. const next = head.next
  9. head.next = p
  10. return next ? reverseList(next, head) : head
  11. };