这段代码实现了一个链表反转的功能。下面是对代码逐行的详细解释:
代码结构
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL) { return NULL; }
ListNode* cur = head;
while (head->next != NULL) {
ListNode* t = head->next->next;
head->next->next = cur;
cur = head->next;
head->next = t;
}
return cur;
}
};
逐行解释
类定义:
class Solution
- 定义了一个名为
Solution
的类,通常用于包含算法的函数。
- 定义了一个名为
成员函数:
ListNode* reverseList(ListNode* head)
- 定义了一个公共成员函数
reverseList
,接收一个指向链表头节点的指针head
,返回反转后的链表头节点。
- 定义了一个公共成员函数
空链表判断:
if (head == NULL) { return NULL; }
- 如果传入的头节点为空(即链表为空),则直接返回空指针。
初始化当前节点:
ListNode* cur = head;
- 将当前节点指针
cur
初始化为链表的头节点,用于记录新链表的最后一个节点。
- 将当前节点指针
循环遍历与反转:
while (head->next != NULL) { ListNode* t = head->next->next; head->next->next = cur; cur = head->next; head->next = t; }
循环条件:只要
head
的下一个节点不为空,就继续进行反转。第一步:保存下一个要处理的节点:
ListNode* t = head->next->next;
将当前节点的下一个节点的下一个(即下下一步)保存到临时变量
t
中,以便后续使用。第二步:进行反转操作:
head->next->next = cur;
将当前节点的下一个节点(即正在处理的节点)的下一个指针指向已反转部分的最后一个节点 (
cur
)。第三步:移动到下一个待处理元素:
cur = head->next; // 更新cur为新的尾部,即原来的第i个元素
第四步:将当前节点指向临时保存的新状态:
head->next = t; // 移动到原本处于当前“线”的点,使其成为新的“线”末端
返回新头部:
return cur;
- 循环结束后,
cur
指向新反转后的链表头部,将其返回。
- 循环结束后,
总结
整体上,该代码通过迭代的方法反转了给定单链表。它不断地改变各个节点之间的连接关系,将原本按顺序排列的链表变为逆序排列。在操作中使用了三个指针来帮助跟踪和调整位置,实现了O(n)时间复杂度与O(1)空间复杂度。
内容由零声教学AI助手提供,问题来源于学员提问