题解 | #反转链表#
反转链表
https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
// 单链表里面只存了后节点,并且只能从第一个节点开始查找
public ListNode ReverseList(ListNode head) {
// 一个或者为空的情况
if( head == null || head.next == null){
return head;
}
// 定义两个个指针,分别指向当前节点的前节点和后节点
ListNode pre = null , next = null;
while(head != null){
// 当前节点的后节点要取出来,等会要把它变成当前节点
next = head.next;
// 把前节点变成当前节点的后节点,这样就实现了反转
head.next = pre;
// 然后当前节点现在变成前节点
pre = head;
// 后面的节点变成当前节点
head = next;
}
return pre;
}
}
之前对ListNode这种数据结构不是很熟悉,导致理解了很久。
把ListNode看作两个部分来理解,当前的节点的元素,以及下一个指针的元素。
输入的链表,其实也就是两个两个连起来的,一个接一个组成了链表。
反转也一样。
比如一开始输入 1 2 3 4,头节点head就是1,指向了2;然后2 指向了 3;3指向了4。
反转就是,首先把前节点pre赋值为null,然后把它作为当前节点的后节点,也就是,1指向了null,2指向了1,3指向了2,4指向了3。这样就很好理解了。

