题目描述:

反转一个单链表。
示例:

  1. 输入: 1->2->3->4->5->NULL
  2. 输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

算法实现:

递归法

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {ListNode}
  11. */
  12. var reverseList = function(head) {
  13. function reverse(head, prev) {
  14. if (head === null) {
  15. return prev
  16. }
  17. next = head.next
  18. head.next = prev
  19. return reverse(next, head)
  20. }
  21. return reverse(head, null)
  22. };

迭代法

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {ListNode}
  11. */
  12. var reverseList = function(head) {
  13. if (!head) return head
  14. let lastNode = null,
  15. curNode = head
  16. while (true) {
  17. let nextNode = curNode.next
  18. curNode.next = lastNode
  19. lastNode = curNode
  20. if (!nextNode) break
  21. curNode = nextNode
  22. }
  23. return curNode
  24. };

思考:

两种方法本质上都差不多,思想就在于让每一个节点的next为null,并让它的next连接为它的前一个节点。

总结:

对两种方法还不是很熟练,需要练习思考。