题解 | #反转链表01#
反转链表
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) {
//利用辅助结点
ListNode cur = head;
ListNode next = null;//保存cur的下一个节点
ListNode rehead = new ListNode(0);//新的头节点
//判断原链表是否为空 或者只有一个节点
//但由于head可能为空 所以会出现空指针异常
if(cur != null){
if(cur.next==null){
return head;
}
}
//利用循环
while (cur !=null){
next = cur.next;//下一节点进行保存
//cur当前节点后所有节点更换成0节点后所有节点
cur.next = rehead.next;
//把包含cur当前节点的链表转移到0节点后,永远让cur的最新节点为0节点后一位
rehead.next =cur;
//往后推移,cur当前节点更新到下一个节点
cur = next;
}
//将rehead后的节点 挂到 head后面 实现head整个链表的反转
head = rehead.next;
return head;
}
}
LC上面的解法 但感觉太麻烦了 也不好理解 原理就是双链表
双链表求解是把原链表的结点一个个摘掉,每次摘掉的链表都让他成为新的链表的头结点,然后更新新链表
cur是原链表 next临时链表 rehead是转移链表
要保持rehead的null节点一直在第一个 就比较费解
查看3道真题和解析