一.反转链表
如果我们有一个链表是1-->2-->3-->4-->5这样的,那我们反转后就是5-->4-->3-->2-->1这样的,那么要如果对链表操作呢?
我们可以发现在反转后的链表里1-->2,变成2-->1那么我们就顺着这个思路,直接将下一个节点插到头节点前不就好了!!看起来好像不是很难,但是实现起来却很简单😉👌,嘿嘿!(^0^)
我们可以再思考一下,将一个节点插到头节点前不就是头插嘛对不对,所以我们可以直接利用头插的方法来解决问题
因为我们要从第二个节点开始插所以定义一个cur节点等于head.next,然后我们要让cur.next指向head,之后再让cur作为头节点(2-->1-->3-->4-->5),这样不就把第二个节点和头节点逆序了吗,对但是不完全对,插是插上去了,可是之后的节点也找不到了,我们在做链表题时一定要记住不能顾头不顾尾,这时就要在定义一个节点(curNext)来存放之前的cur的下一个节点,让cur可以找到之后的尾巴,最后返回头节点就可以了!!
不过要注意,传进来的链表可能是空的,或者只有一个节点这时就不需要反转了直接返回就行了,是不是很简单😉😉
源码如下(不过我建议自己先敲一遍):
其实还可以用栈来实现,只需要将链表压入栈,再拿出来就直接反转了,我觉得这个你可以自己来试一试了😘
二.链表的中间节点
要找到一个链表的中间节点,你第一瞬间是不是想遍历一遍就好了嘛,得到链表长度在遍历一半不就好了。但是你自己可能也觉得这种方法,也太残暴了吧😵,效率肯定不过。那么有没有什么快一点的方法呢?答案是有的--快慢指针。
直接讲核心思想就是,一个指针的速度是另一个指针的二倍。我们定义两个节点fast和slow,fast一次走两步,slow一次走一步,那么当fast走完链表时slow是不是就是在链表中点位置😎,这个方法是不是很巧妙。
不过我们要注意如果链表节点个数为偶数最后fast后面会只有一个节点,要判断好,不然会出错,
代码如下(不过我建议自己先敲一遍):
java:
c:
//我们还可以扩展一下思维既然我们可以用这种方法找到中间节点,那么应该也可以找到倒数第三个节点,倒数第四个节点,有兴趣的话可以试一试,自己解决的想出来的方法,记忆和理解会更深刻的!!相信自己可以!🥰🙉