不要再因为那些你不能控制的事情有压力了,要专注于你能控制的事情
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。
👏👏👏
哈喽!大家好,首先将我的刷题神器分享出来,点此注册
😍😍😍
对于程序员来说算法属于基本功,掌握了算法就能够写出更高效的代码,所以一个好的练习算法的网站尤为重要,现在分享一下我经常刷算法题的网站,上面不仅有算法题,还有其他类型的题,赶紧刷起来吧,算法神器
import java.util.Stack;
public class Solution {
public ListNode ReverseList(ListNode head) {
//新链表
ListNode newHead = null;
while (head != null) {
//先保存访问的节点的下一个节点,保存起来
//留着下一步访问的
ListNode temp = head.next;
//每次访问的原链表节点都会成为新链表的头结点,
//其实就是把新链表挂到访问的原链表节点的
//后面就行了
head.next = newHead;
//更新新链表
newHead = head;
//重新赋值,继续访问
head = temp;
}
//返回新链表
return newHead;
}
}
这里给出双链表的解决方式,也是较为简单方便的一种方式,就是将原来的链表放入到另外一个链表中。
这里我用画图的方式来分析每一行代码分别操作了什么。
1、首先我们先创建一个三个长度的链表,如下图:
这里相当于我们代码中传入的head,这个时候head是指向链表第一个元素的地址,这里“001”、“002”、“003”就是计算机中的存储地址,这里我们可以看到“001”地址里的元素的next指向的是“002”地址,然后“002”中的元素的next指向的是“003”地址,“003”地址的元素next指向的是“null”,代表到“003”地址这里这个链表就结束了。
这个时候head其实就是指向“001”地址。
2、然后是下一段代码
//新链表
ListNode newHead = null;
这里相当于新建一个newHead指向“null”。如下图所示:
3、然后是下一段代码。
//先保存访问的节点的下一个节点,保存起来
//留着下一步访问的
ListNode temp = head.next;
这里相当于新建一个temp用来指向head的下一个节点的位置。如图所示。
4、然后是下一段代码。
//每次访问的原链表节点都会成为新链表的头结点,
//其实就是把新链表挂到访问的原链表节点的
//后面就行了
head.next = newHead;
这里是将head的next指向newHead的位置,因为这个时候newHead是“null”,所以head位置的元素的next指向的值就由原来的“002”变为现在的“null”,如下图所示。
5、接下来是这段代码。
//更新新链表
newHead = head;
这里就是将newHead指向head的位置,因为head指向的是“001”的地址,所以现在newHead从原来指向“null”值变为指向“001”的位置。如下图所示:
6、接下来是这段代码。
//重新赋值,继续访问
head = temp;
这里将head指向temp的位置,如下图所示:
7、接下来又开始走while循环,判断head是否等于空,这里可以看到,head不为空,所以进入循环重复上面的代码,然后走第一段代码:
//先保存访问的节点的下一个节点,保存起来
//留着下一步访问的
ListNode temp = head.next;
这个时候就是将temp指向head的next的位置,所以这里temp指向“003”的位置,如下图所示:
8、然后走下面这一段代码:
//每次访问的原链表节点都会成为新链表的头结点,
//其实就是把新链表挂到访问的原链表节点的
//后面就行了
head.next = newHead;
这里将head的next指向newHead的位置,就是将head的next从原来的“003”指向现在newHead指向的“001”位置,如下图所示:
9、然后走下面这段代码:
//更新新链表
newHead = head;
这里将newHead指向head的位置,就是将newHead从原来的“001”位置变为目前的“002”位置,结果如下图所示:
10、然后走下面这段代码:
//重新赋值,继续访问
head = temp;
这里将head指向temp指向的位置,结果如下图所示:
11、然后再次进行循环判断,这个时候head指向的位置还有数据,所以再次进入循环中,执行下面的代码:
//先保存访问的节点的下一个节点,保存起来
//留着下一步访问的
ListNode temp = head.next;
这里将temp指向head的next位置,因为这个时候head的next指向的是“null”,所以temp这里指向的也是“null”,结果如下图所示:
12、然后执行如下代码:
//每次访问的原链表节点都会成为新链表的头结点,
//其实就是把新链表挂到访问的原链表节点的
//后面就行了
head.next = newHead;
这里将head.next指向newHead的位置,就是将原来head的next的“null”变为“002”,结果如下图所示:
13、然后执行下面这段代码:
//更新新链表
newHead = head;
这里使newHead指向head,结果如下图所示:
14、然后执行下面这段代码:
//重新赋值,继续访问
head = temp;
这里将head指向temp,因为这是temp指向的是“null”,所以这里head也指向null,结果如下图所示:
15、这个时候又开始循环判断,但是这个时候head就是“null”了,这个时候就可以将newHead输出了,可以看出这个时候这个链表已经反转了。
代码写完了就需要先自测一下,这个时候我们点击自测运行看一看能不能测试通过。
这里我们可以看到自测成功了,那我们就点击保存并提交来提交此题。
提交答案后会显示我们此题的运行时间以及占用内存,并且判断我们这两项超过了其他百分之多少的人,我们还可以点击进入下一题来接着进行刷题,这样会越刷越上瘾的。
通过这个刷题神器刷题是真的过瘾,通过画图的方式将每一行代码分析出来就不会觉得代码难以理解了,所以赶紧刷起来吧,点此注册
可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。