算法刷题之路之链表初探(五)
今天来学习的算法题是leecode206反转链表,是一道简单的入门题,话不多说!直接上!
条件
图解(先看图结合后面的思路一起看·)
项目解释
有题目可以知道,我们需要将链表反转,那么很多没有学过链表的小伙伴可能会想到将每个数据换个位置,第一个和最后一个换,第二个和倒数第二个换以此类推,但这是非常错误的想法,一定不要从这方面去想。
这种错误想法的底层逻辑无非就是新建一个无关的值
例子:
a = 2,b=1,要互换两个数的值使得b=2,a=1
那么我们正常常规的思路就是
new一个c出来使得c=a,
然后让a=b,b=c,
此时a=1,b=2完成了值得互换
第一眼看待反转链表得时候,我也是这个想法,最后走了很多的弯路。最后我一朝得道!那正确的解法是什么呢??
重点!!!!!!!!!!!
链表之所以是链表,正是因为他是由链(指针)来连接的,我们完全不需要考虑怎么把每个链的值转换来完成反转,我们只需要改变链的指向就可以了!!,因为这类题的核心思想就是**“公说公有理,婆说婆有理,谁都不服谁,找儿子来当中间人”**,那么在保持中心思想不变的情况下,在链表中使用改变指针指向就可以解决这个问题!
例子
链表
a-> b-> c反转a<-b<-c
而不是要获取道每个链表的值,然后再遍历修改
那么这个时候又要说一个很重要的点了,链的头和尾是可以存在null节点的,那么再结合这个空节点我们就可以得到改变指针指向循环的终止条件!
总结下来,其实又可以说是一种双指针的思想,我们只需要改变两个指针+上文说到的中间量,再结合普通值转换的思想就可以完成这个问题啦!
思想总结:
①理解链表的节点指向的问题
②理解链表存在空节点
③结合中间值来完成链表的转向 ( 一>变成<一)
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}