反转链表:
问题描述:
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2:
输入:head = [1,2] 输出:[2,1]示例 3:
输入:head = [] 输出:[]
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//定义了一个指向 null 的节点 prev,用于存储反转后的链表的前一个节点。最开始的时候,反转链表的前驱节点为 null,因为反转后的第一个节点会成为尾节点,其 next 指针应该指向 null
ListNode prev = null;
//定义了一个指向当前节点的指针 curr,最初指向原链表的头节点 head。这是用于遍历链表的指针
ListNode curr = head;
while(curr!= null){
// 临时保存当前节点的下一个节点 next,因为在反转链表的过程中,当前节点的 next 指针会被修改,先存储它以免丢失后续的链表结构
ListNode next = curr.next;
// 将当前节点的 next 指针指向 prev,这一步完成了链表节点的反转操作。
curr.next = prev;
// 移动 prev 指针,使它指向当前节点。这样在下一次迭代时,当前节点会成为下一次迭代中处理的节点的前一个节点。
prev = curr;
// 移动 curr 指针,使它指向下一个节点(即之前存储的 next),准备处理下一个节点
curr = next;
}
return prev;
}
}