思路:双指针,curr表示当前指针,prev表示当前指针的下一个指针。
反转:curr.next = prev
移动位置:注意要先移动cur,再移动prev
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null) return null;
ListNode prev = null;
ListNode cur = head;
while(cur != null){
ListNode nextNode = cur.next;
// 反转
cur.next = prev;
prev = cur;
cur = nextNode;
}
// 退出循环时cur == null,所以返回cur的前一个,也就是prev
return prev;
}
}
递归:终止条件, cur == null,
返回值:prev
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
return recur(head, null);
}
ListNode recur(ListNode curr, ListNode prev){
if(curr == null) return prev; // 递归的终止条件
ListNode res = recur(curr.next, curr); // 递归后继节点
curr.next = prev; // 修改节点引用指向
return res; // 返回反转链表的头节点
}
}