算法之反转问题

5/21/2021

# 反转问题

  • 链表反转 -剑指Offer.24
//迭代
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null, cur = head;
        while(cur != null){
            ListNode nxt = cur.next; //保存下一个
            cur.next = pre; //当前连接上一个
            pre = cur; //将上一个后移
            cur = nxt; //将当前后移
        }
        return pre;
    }
}

//递归
class Solution {
	public ListNode reverseList(ListNode head) {
		//递归终止条件是当前为空,或者下一个节点为空
		if(head==null || head.next==null) {
			return head;
		}
		//这里的cur就是最后一个节点
		ListNode cur = reverseList(head.next);
		//这里请配合动画演示理解
		//如果链表是 1->2->3->4->5,那么此时的cur就是5
		//而head是4,head的下一个是5,下下一个是空
		//所以head.next.next 就是5->4
		head.next.next = head;
		//防止链表循环,需要将head.next设置为空
		head.next = null;
		//每层递归函数都返回cur,也就是最后一个节点
		return cur;
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

递归的比较难理解,这里配合三个图(只要把这三步搞懂,这题就通了)

  • 实际上在图1的红区已经是在执行4的next的next,所以head在下面是4,4.next=5,cur=5。这波啊,这波是秦王绕柱走 foo
  • 下面是给给指针调头的,让指针从4->5变成4<-5 foo foo

整数反转

  • 题目是这样的:
    • 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。
    • 分析:这个题考察的难点其实在数学,32位数,Integer范围在±2^32,而MAX_VALUE和MIN_VALUE就是代表的这个上下限
class Solution {
    public int reverse(int x) {
        int ans = 0;
        while(x != 0){
            int pop = x%10;
            if(ans > Integer.MAX_VALUE/10 || (ans==Integer.MAX_VALUE/10 && pop>7))
                return 0;
            if(ans<Integer.MIN_VALUE/10 || (ans==Integer.MIN_VALUE/10 && pop<-8))
                return 0;
            ans = ans*10 + pop;
            x /= 10;
        }
        return ans;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Last Updated: 5/24/2021, 12:14:31 PM