迭代版本
头插法
初始节点ListNode list = null
,遍历原链表,每遍历一个节点先记录其下一位的地址,在把本节点的下一位改为list
(即把本节点从链表list
头部插入,因为list
是一个节点而不是无意义的表头,所以插入后要更新其为新的表头),再处理下一个节点
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode list = null, pos = head, temp; // list是反转后的链表表头 空链表即为null
while (pos != null) {
temp = pos.next; // 记录下一个节点
pos.next = list; // 本节点的下一位改为list
list = pos; // 更新list
pos = temp; // pos移到它原本的下个节点
}
return list;
}
}
递归
反转后新链表的表头应是原来的表尾,所以递归时要把表尾逐层返回
先递归下一个节点,再改next
指向
每层递归都知道当前节点和下个节点,而不知道上个节点的位置,所以修改next
时,应该是修改下个节点的next
指向本节点
/**
* 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 || head.next == null) return head; // 是最后一个节点 就返回自身 因为它是新链表的表头
ListNode tail = reverseList(head.next); // 接收传回的新表头 并最终返回
head.next.next = head; // 下个节点的下一个节点是本节点
head.next = null; // 本节点的下一个节点暂不明 即为null 留待上一层递归处理
return tail;
}
}