输入:单链表的头节点 head。
要求:将链表反转,并返回反转后的头节点。
输出:反转后的链表头节点。
思路:头插法
这个方法的核心是创建一个新的空链表(由一个虚拟头节点 dummy 代表),然后遍历原始链表,将每个节点逐一“摘下”,并使用“头插法”插入到新链表的最前端。由于头插法会将后遍历到的元素放在前面,因此遍历完成后,新链表就是原始链表的反转版本。
-
1. 初始化: 创建一个虚拟头节点
dummy,它的next指针初始为NULL。这个dummy将作为反转后链表的头。 -
2. 遍历与插入: 循环遍历原链表,只要
head不为空:- a. 保存下一个节点: 用临时指针
tmp存下head的下一个节点 (tmp = head->next),防止断链。 - b. 头插: 将当前
head节点插入到dummy之后。head->next = dummy->next;// 当前节点指向新链表的第一个节点dummy->next = head;// 虚拟头节点指向当前节点,使其成为新的第一个节点
- c. 前进: 将
head指针移动到原链表的下一个节点 (head = tmp;)。
- a. 保存下一个节点: 用临时指针
-
3. 返回结果: 循环结束后,
dummy->next就是反转后链表的真正头节点。
复杂度:
- 时间复杂度: O(n)O(n)O(n)
- 空间复杂度: O(1)O(1)O(1)
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* dummy = new ListNode(0, NULL);
ListNode* tmp;
while (head) {
// 1. 保存原链表的下一个节点
tmp = head->next;
// 2. 将当前节点头插到新链表
head->next = dummy->next;
dummy->next = head;
// 3. 继续遍历原链表
head = tmp;
}
return dummy->next;
}
};
310

被折叠的 条评论
为什么被折叠?



