反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
我的算法实现:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function (head) {
// 保存最后一个节点用
let tempHeader;
// 如果传进来的是 null 直接返回
if (!head) {
return null;
} else if (!head.next) { // 如果只有一个节点也直接返回
return head;
}
// 递归
const _reverse = (node) => {
// 如果是 node.next.next 都为空了,此时的最后一个节点是 node.next
if (node.next.next === null) {
tempHeader = node.next;// 保存最后一个节点
} else {
// 如果不是最后一个节点就一直进行下去
_reverse(node.next);
}
// 处理反转 如果是最后一个节点,让它的下一个节点指向前一个节点
node.next.next = node;
};
_reverse(head);
// 完成以后把第一个节点指向 null
head.next = null;
return tempHeader;
};
这次我特意使用递归的方式写这道题目,特意练习一下,所以花费的时间有点多。再加上突然自己在公司写的 bug 暴露了,于是不得不修复 bug ,最后弄得这么晚。
思路就是保存两个节点,然后让后一个节点指向前一个节点,所以在刚开始的地方我就处理了空节点和只有一个节点的情况。
我看了看官方的讲解更好,代码一如既往的简单,可读性强:反转链表
利用好递归的返回值是非常好的。
来源:力扣(LeetCode)