leetcode 206.反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
这道题要求我们将一个链表反转,刚一看这道题目反转好像很难,但仔细分析后发现这道题的关键就是next指向问题。
平时我们做的链表题目都是让它的当前节点指向它的后一个节点,这样一步一步循环,那么这道题就跟之前的正好相反,每次遍历都是让它的当前节点指向它的前一个节点,知道了这点这个题目就好做了。画个草图理解一下
每次循环都让当前指针指向前一个节点
var reverseList = function(head) {
//先判断为null的情况
if (head == null || head.next == null) {
return head;
}
var current = head //当前节点
var pre = null //前一个节点
while(current != null){
var next = current.next //先保存一下当前节点的下一个节点
current.next = pre //让当前节点指向它的前一个一个节点
pre = current // 前一个指针后移
current = next //当前指针后移
//current = current.next 错误的写法,因为这个时候current.next = pre,current = pre = null,跳出了循环
}
return pre
};
这道题的关键在于当前指针指向前一个节点,还有就是每次保存当前的节点的下一个节点.
递归解法
var reverseList = (head, q = null) => {
console.log(q);
if (head) {
return reverseList(head.next, {
val: head.val,
next: q,
});
}
return q;
}
虽然看不懂,但还是要记录一下,万一以后水平提升了说不定就能看懂了
不积跬步无以至千里