反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
这是一道经典easy题,但想要完全弄明白并没有那么容易。
我们使用三个指针来解决此题,分别是pre、cur和temp指针。
1.初始化指针:
pre 初始化为 NULL,它将指向反转后的链表的头节点,现在可以把它看作是原始链表头节点前面的节点。
cur 初始化为 head,它是原始链表的头节点。
temp 用于临时存储当前节点的下一个节点。
2.遍历链表:
使用 while 循环遍历链表,直到 cur 为 NULL,即链表的末尾。
3.反转节点的指针:
在循环内部,首先保存当前节点cur的下一个节点到 temp。
然后,将当前节点 cur 的 next 指针指向 pre,这样就反转了当前节点的指向。
接着,将 pre 更新为当前节点 cur,因为我们刚刚反转了它的指针,所以它现在是新的 pre。
最后,将 cur 更新为 temp,即移动到下一个节点。
4.返回反转后的链表头节点:
当循环结束时,cur 将为 NULL,此时 pre 指向原始链表的最后一个节点,也就是反转后链表的头节点。
返回 pre 作为反转后链表的头节点。
模拟过程:
初始状态:pre = NULL,cur = 1(头节点),链表是1 => 2 =>3 => 4=> 5
第一次循环:
temp = 2(cur->next)
cur->next = pre(1->next 变为 NULL)
pre = cur(pre 变为 1)
cur = temp(cur 变为 2)
链表变为NULL <=1 => 2 => 3 => 4 =>5
第二次循环:
temp = 3
2->next = 1
pre = 2
cur = 3
链表变为NULL <=1 <=2 => 3 => 4=> 5
第三次循环:
temp = 4
3->next = 2
pre = 3
cur = 4
链表变为NULL <=1 <=2 <= 3=> 4 => 5
第四次循环:
temp = 5
4->next = 3
pre = 4
cur = 5
链表变为NULL <=1 <=2 <= 3 <= 4 =>5
第五次循环:
temp = NULL
5->next = 4
pre = 5
cur = NULL(循环结束)
链表变为NULL <=1 <=2 <=3 <= 4 <=5
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur=NULL;
ListNode* pre=head;
while(pre)
{
ListNode* temp=pre->next;
pre->next=cur;
cur=pre;
pre=temp;
}
return cur;
}
};
完成了该题后还可以试试
leetcode92 | 反转链表II |
---|---|
牛客OR152 | 每k个一组反转链表 |
其中leetcode92.反转链表II,我写了详细题解,多图讲解,带你一步步理解全过程。