倒数第几个(本质上是将倒数 转化成(两个点之间)具体的距离)
1、19_删除链表的倒数第N个结点:
// 方法三: 通过 设置两个距离是n 的指针(不断的往后走,走到最后,差距便是倒数
//本质上是将倒数 转化成(两个点之间)具体的距离,而这距离是需要通过遍历到达的
// 方法三: 通过 设置两个距离是n 的指针(不断的往后走,走到最后,差距便是倒数 //本质上是将倒数 转化成(两个点之间)具体的距离,而这距离是需要通过遍历到达的 class Solution3 { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(0, head); ListNode first = head; ListNode second = dummy; for (int i = 0; i < n; ++i) { first = first.next; } while (first != null) { first = first.next; second = second.next; } second.next = second.next.next; ListNode ans = dummy.next; return ans; } }
2、530_二叉搜索树的最小绝对差:
编程里要有思维:距离、差(是两个点或者两个数据之间的事) |
二叉树求最小绝对值(两个结点的数据)差(距离)
~其实就是转化成了求二叉树中找到两个点的数据是在所有数据中最小的
(本质是数据的关系,无关形态,咱需要拿到二叉树的数据(遍历)~然后题目要求要找出两个数据之间的差最小,这目标就变成了:如果处理数据?
可以进行升序处理,两个数据挨得近,差值越小,而且刚好升序符合 二叉树的遍历(即拿数据的时候,同时用一定规则(升序)处理数据,从而获得结果))
(1)差:首先要有两个数据啦,而遍历肯定是先一开始才拿到一个数据,所以咱要通过某种条件得知才拿到一个数据,不立马进行比较,同时记录“第一次”(前次数据),留给“”第二次”(当前数据)进行比较得出一个差值。
(2)过程中也是不断比较,更新差值:【补充一下:为啥不之间将题目给的接口,套用中序遍历的模式,而是另外再封装一个接口】:
(3)首先 尽量一个接口的方法名(名如其功能),其次,该方法若是 套用了中序的遍历模式的同时,中序用到的递归(这就彻底翻车了,函数功能很重要呀,递归之后的返回值表明不符题意了)
(4)最后是,辅助变量(前一个结点的数据),若是写在了题意给的接口里,导致 无法区分开,中序遍历才刚刚开始,才刚刚拿到第一个结点数据(虽然也可以解决:通过定义为全局变量)
(5)最最后,结果变量,若是在题意给的接口里使用中序遍历,最后得到了一个结果的返回(。。。。。其实也有点挺麻烦的)
官网代码:
//从第二个结点开始,每次进入一个新的结点,都要不断的更新最小距离(同时咱还要好好利用中序的特点就是从小到大排序的呀,当前结点的加入得出的新最小值只需要跟前面一个进行对比即可) int prev; int ans; public int getMinimumDifference(TreeNode root) { prev = -1; ans = Integer.MAX_VALUE; inorder(root); return ans; } //通过拿到前一个的val ,第二个val 减掉即可得知最小的 public void inorder(TreeNode node) { if(node == null) return; inorder(node.left); //拿到当前结点,需要判断一下是否遍历到第二个结点了 if(prev == - 1) { //才遍历到当前第一个结点 prev = node.val; }else { ans = Math.min(ans, node.val - prev); prev = node.val; } inorder(node.right); }