head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
Related Topics
结合上一篇LeetCode刷题【剑指 Offer 24】反转链表一起看,是同一个问题,不过这里不用迭代遍历了
class Solution {
ListNode preNode;
ListNode tail;
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null){
return head;
}
preNode = head;
nextNode(head.next);
head.next = null;
return tail;
}
public void nextNode(ListNode node){
if (node == null){
tail = preNode;
return;
}
ListNode next = node.next;
node.next = preNode;
preNode = node;
nextNode(next);
}
}
这是递归的方法,不过本质上还是和遍历迭代是一样的
- 在递归的过程中记录上一个递归到的节点preNode
- 把当前节点的next指向之前记录的preNode
- 把preNode指向当前节点
- 继续处理next节点
- 别忘了头结点的next指向也要清除掉
发表评论