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;
}
}