对于递归算法,最重要的就是明确递归函数的定义 递归操作链表并不高效。和迭代解法相比,虽然时间复杂度都是 O(N),但是迭代解法的空间复杂度是 O(1),而递归解法需要堆栈,空间复杂度是 O(N)。所以递归操作链表可以作为对递归算法的练习或者拿去和小伙伴装逼,但是考虑效率的话还是使用迭代算法更好。

问题:

1.递归反转整个单链表

图片.png

  1. function reverse(head){
  2. if(!head.next)return head;
  3. const last = reverse(head.next);
  4. head.next.next = head;
  5. head.next=null;
  6. return last;
  7. }

2.反转链表前n个元素

  1. function reverseN(head,n){
  2. let successor;
  3. return reverse(head,n);
  4. }
  5. function reverse(head,n){
  6. if(n===1){
  7. successor = head.next;
  8. return head;
  9. }
  10. let last = reverse(head.next,n-1);
  11. head.next.next = head;
  12. head.next = successor;
  13. return last;
  14. }

3.反转部分链表

  1. function reverseBetween(head,m,n){
  2. if(m===1){
  3. return reverseN(head.n);
  4. }else{
  5. head.next = reverseBetween(head.next,m-1,n-1);
  6. return head;
  7. }
  8. }