LeetCode 递归 记录 day01

123 阅读1分钟

01 反转字符串

读题

  • 原地修改数组
  • 假设所有字符可打印

双指针

  • 时间复杂度 O(N) N/2次交换
  • 空间复杂度 O(1)
class Solution {
    public void reverseString(char[] s) {
      if(s.length==0){
          return;
      }
      for(int i=0;i<=s.length-1;i++){
          char temp = s[i];
          for(int j=s.length-i-1;j>i;j--){
              s[i] = s[j];
              s[j] = temp;
              break;
          }
      }
    }
}

递归

  • 道理一样,交换边界值
  • 然后 左+1 右-1
class Solution {
    public void reverseString(char[] s) {
     if(s.length==0){
         return;
     }
     int left = 0;
     int right = s.length-1;
     while(left<right){
         changeVar(left,right,s);
         left += 1;
         right -= 1;
     }
    }
    
    public void changeVar(int l,int r,char[] c){
        char temp = c[l];
        c[l] = c[r];
        c[r] = temp;
    }
}

02 两两交换链表节点

  • 分解问题
  • 递归处理子问题
  • 处理递归产生的结果

读题

不能只单纯改变节点的值,要实实在在交换节点。

  • 特殊情况,排除 要先判断head不为null,再判断head.next ~~~
  • 递归 产生的结果传递到外面一层递归 传递的就是头结点
  • 返回值
class Solution {
    public ListNode swapPairs(ListNode head) {
        //没有next 直接返回
        if(head == null || head.next == null ){
            return head;
        }
    
        // 交换节点
        // head head.next
        ListNode headNext = head.next;
        // 函数要返回头节点,递归传递的信息就是头结点
        // 递归就是 swapPairs(headNext.next)
        // 交换位置以后,下次递归的链表的头节点是
        head.next= swapPairs(headNext.next);
        headNext.next = head;
        return headNext;
  
    }
}