题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路
方法一 迭代法
我们知道,链表的指向是由头节点一直指向尾节点,最终指向null
的,我们可以创建两个指针,第一个指针reverse
指向null
,第二个指针cur
.
从head
头部开始遍历链表,每次遍历都将cur
的next
指向reverse
,同时将cur
和reverse
同时前进一位。直到cur
的值为null
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
// 判断链表是否为空或者是否只有一个元素
if(!head || !head.next) return head;
// 初始化两个指针
var reverse = null;
var cur = head;
// 循环指针
while(cur){
// 临时变量存储下一个节点
var next = cur.next;
// 将cur 的下一个节点
cur.next = reverse;
reverse = cur
cur = next;
}
return reverse
};
方法二 递归
其实递归的写法更为简洁,递归的终点是null
,我们只需要循环到链表的尾部,每次返回时,将当前节点的下一个节点指向当前节点即可。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
// 判断链表是否为空或者是否只有一个元素 设置递归边界
if(!head || !head.next) return head;
var next = head.next
// 执行递归操作
var ret = reverseList(next);
// 执行到尾部
next.next = head;
head.next = null;
return ret;
}