力扣https://leetcode.cn/problems/reverse-linked-list/简单题就没什么好讲的了,直接贴代码
解决方案
方案一:快慢指针(注意这里其实需要三个指针,leetcode官方题解里是在循环里每次new一个node,放到外面可以适当节省内存)
public class _206_reverseList {
public ListNode reverseList(ListNode head) {
// base case
if(head == null || head.next == null) {
return head;
}
// 指向当前index的指针(用于反转时记住上一个节点)
ListNode temp = head;
ListNode cur = head.next;
ListNode next = cur.next;
head.next = null;
while(cur != null) {
cur.next = temp;
// 如果next是null,表示cur已经来到最后一个node,直接跳出循环
if(next == null) {
break;
}
temp = cur;
cur = next;
next = cur.next;
}
return cur;
}
}
方案二:递归
这个方案就更没什么可以讲的了,是leetcode官方题解的一种。
个人觉得如果不是资源限制类的DP题目没必要使用递归,纯粹浪费空间。
class Solution {
public ListNode reverseListRecusion(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}