F1:利用linkedLisst保存,使用头插法改变数据的位置,使用下标改变节点的指向

import java.util.LinkedList;
public class Solution {
    public ListNode ReverseList(ListNode head) {
    	//创建一个linkedlist作为容器
        LinkedList<ListNode> integers = new LinkedList<>();
        //判断是否为空,如果为空直接返回null
        if(head == null){
            return null;
        }
        //将原本链表中的元素使用头插的方法插入在linkedlist中
        while (head != null){
            integers.addFirst(head);
            head = head.next;
        }
        //更新节点的指向顺序
        for (int i = 0; i < integers.size(); i++) {
            if (i != integers.size() -1) {
            	//利用下标重新更改节点之间的指向
                integers.get(i).next = integers.get(i + 1);
                continue;
            }
            //最后一个节点的next为null
            integers.get(integers.size() - 1).next = null;
        }
		//返回首节点
        return integers.getFirst();
    }
}

F2:使用三个节点,重复修改节点的指向保证链表的反转;

import java.util.LinkedList;
public class Solution {
    public ListNode ReverseList(ListNode head) {
        //pre节点便于链表局部节点的反转,next节点保证前面节点的反转时不会产生链表的丢失
        ListNode pre = null;
        ListNode next = null;
        if (head == null){
            return null;
        }
        while (head != null){
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        //当head==null,表明所有pre就是最后一个节点了,而pre节点表示的就是已经反转后的节点范围的weijiedian
        //直接返回这个节点就表示了新的链表的节点;
        return pre;
    }
}

F3:创建新的链表,维护节点的指向,删除旧链表,帮助GC;

import java.util.LinkedList;
public class Solution {
    public ListNode ReverseList(ListNode head) {
        ListNode temp = head;
        //创建一个新的头结点,并且赋值为null
        ListNode newHead = null;
        //如果head不为空就不停将值创建新的链表;
        while (head != null){
            ListNode listNode = new ListNode(head.val);
            if (newHead == null){
                newHead = listNode;
            } else{
            	//头插法改变节点的指向;
                listNode.next = newHead;
                newHead = listNode;
            }
            //head节点表示当前需要赋值的节点
            head = head.next;
        }
        //帮助gc,删除旧的链表
        while(temp != null){
            temp.next = null;
            temp = temp.next;
        }
        return newHead;
    }
}