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;
}
}