题目链接:https://leetcode.cn/problems/reverse-linked-list/
方法一:循环,维护好两个节点一个前一个后
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode local = head;
while(local != null){
ListNode temp = local.next;
local.next = pre;
pre = local;
local = temp;
}
return pre;
}
}
方法二:递归
比较难想,首先我们直接递归找到最后的头节点,这个头结点不能再动了,直接有一个.next.next就是找下一个节点,把下一个节点的下一个指向当前节点,然后当前节点下一个指空,这样子回到上一个递归的时候就可以保持头节点不变,只变化了中间的节点关系,就算head指向了空也没事,递归回去栈中还保存着head的信息不会丢失。
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null||head.next ==null)
return head;
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
方法三:头插法(最好想的一种办法,推荐)
循序很重要,头插法首先先记录下来头节点下一个的点存起来,然后头节点指向当前节点,然后头结点的下一个下一个指向存起来的点,head继续指向下一个,head的next不能动。这里我们需要知道一个点:p.next = head,head = head.next , p.next 不会指向head.next就像变量赋值一样的道理。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode p = new ListNode(0);
while(head!=null){
ListNode temp = p.next;
p.next = head;
head = head.next;
p.next.next = temp;
}
return p.next;
}
}