1. 题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
2. 解题思路
对于链表的操作,实际上就是在操作链表的指针。所以,对于这道题,我们能想到的最直接的方法就是将每个节点的指针指向该节点的前驱节点,这样整个链表就反转过来了,我们需要设置三个指针:分别指向前驱节点,当前节点,后驱节点。
再尝试着使用递归来实现这个题目:
对于这道题来说,最重要的就是反转的操作:当前节点是head
,那下一个节点就是head.next
,我们只要将head.next
指向head
,就实现了反转。最后只要将head
和head.next
之间的指针断开,就实现了两个节点之间的指针反转。最后在递归执行以上步骤即可。
3. 代码实现
第一种方法:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
// 设置指针指向前驱节点和当前节点
let pre = null
let cur = head
// 遍历链表,直到链表节点为空
while (cur!= null){
// 记录当前的节点,用于后面的遍历
let next = cur.next
// 调转链表的指针方向
cur.next = pre
// 向后移动指针
pre = cur
cur = next
}
return pre
};
第二种方法:
/**
* 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
}
let res = reverseList(head.next)
head.next.next = head
head.next = null
return res
}
4. 提交结果
第一种方法:
第二种方法: