给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2:
输入:head = [1,2] 输出:[2,1]示例 3:
输入:head = [] 输出:[]
单链表
耗时:30H
1.注意看注释 主要考察循环的理解
2.注意链表是有链接的,如果没处理好链接则会丢失后续所有链表的指向
class Solution {
public ListNode reverseList(ListNode head) {
//反转链表需要逐个节点地改变指针方向
//指向已反转部分的最后一个节点。
ListNode pre = null;
//暂存当前节点的下一个节点,以防止在反转指针后失去对后续节点的引用。
ListNode tmp = null;
//定义指针 指向当前正在处理的节点。
ListNode cur = head;
//注:tmp知识负责暂存当前处理的下一个节点
while(cur != null){
//tmp 先暂存后面所有指针,避免找不到
tmp = cur.next;
//交换指针
cur.next = pre;
//重置更新指针
pre = cur; // 将pre指向当前节点 |更新前驱节点为当前节点,准备下次循环。
cur = tmp; // 将cur移动到下一个节点 |移动到下一个节点,继续遍历。
}
//返回逆序后的链表
return pre;
}
}
便于理解:
我们以前都学过swap,交换两个变量的值(1.使用位运算 2.使用第三方变量),这个也可以这样理解不过是循环
public ListNode reverseList(ListNode head) {
//A
ListNode pre = null;
//空杯
ListNode tmp = null;
//(allB)
ListNode cur = head;
while(cur != null){
//一个空水杯 装剩下所有的水(allB)
tmp = cur.next;
//allB空出来了就装要交换的A
cur.next = pre;
//A杯空了 把要交换的(allB)杯里面的水放A中
pre = cur;
//把tmp空出来 准备新杯子
cur = tmp;
}
return pre;
}