反转链表
反转一个单链表,主要就是改变节点的next值,每次循环的存储next的值,防止后面指针丢失了
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
循环
注意:pre的值就是翻转的链表
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
let reverseList = (head) => {
if (!head) {
return null;
}
let pre = null;
cur = head;
while (cur) {
//保存next
let next = cur.next;
//替换next
cur.next = pre;
//设置pre的值
pre = cur;
//设置当前项的值
cur = next;
}
return pre;
};
每次循环pre和cur的值
次数 | pre | cur |
---|---|---|
第一次 | 1->null | 2->3->4->5->NULL |
第二次 | 2->1->null | 3->4->5->NULL |
第三次 | 3->2->1->null | 4->5->NULL |
第四次 | 4->3->2->1->null | 5->NULL |
第五次 | 5->4->3->2->1->null | NULL |
递归
let reverseList = (head) => {
if (!head) {
return null;
}
let reverse = (pre, cur) => {
if (cur) {
// 保存 next 节点
let next = cur.next;
cur.next = pre;
return reverse(cur, next);
}
return pre;
};
return reverse(null, head);
};