这段代码实现了一个链表的反转。下面我将详细解释每一步以及通过一个具体例子来说明其操作过程。
代码步骤解析
类定义:
class Solution
- 定义了一个名为
Solution
的类,通常在 LeetCode 等平台上用来封装解决方案。
- 定义了一个名为
函数签名:
ListNode* reverseList(ListNode* 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;
将当前
head
节点的下一个节点(即正在处理的那个节点)的下一个指针保存到临时变量t
中,以便后续使用。调整指针,实现反转:
head->next->next = cur;
将当前正在处理的节点(
head->next
)的下一个指针指向已反转部分的新尾部 (cur
)。更新当前节点:
cur = head->next;
将
cur
更新为当前正在处理的节点,以便在下一次迭代中作为新尾部使用。移动到下一个要处理元素:
head->next = t;
将原始链表中的
head
移动到保存好的下一节点,即准备进入下一轮迭代。
返回新的头部:
return cur;
循环结束后,
cur
指向新的反转后的链表头,将其返回。
示例讲解
假设我们有以下单向链表:
1 -> 2 -> 3 -> 4 -> NULL
步骤分析
初始状态:
head
: 指向 1cur
: 指向 1
第一轮循环:
保存下个元素:
t = head->next->next; // t 指向 3
调整指针:
head->next->next = cur; // 当前结点(2)的 next 指向 1
此时结构变成:1 <- 2 -> 3 -> 4 -> NULL ↑ cur
更新当前:
cur = head->next; // cur 指向 2
移动原始头部:
head->next = t; // 原始头部移至3
第二轮循环:
- 当前状态:
head
: 指向 3cur
: 指向 2
重复上述步骤。
最终结构变成:
- 当前状态:
1 <- 2 <- 3 <- NULL
↑
cur
- 第三轮循环,再次进行相同步骤,最终完成整个列表逆序:
最后结果:
4 -> 3 -> 2 -> 1 -> NULL
在所有元素都被处理完之后,返回值即为新的头结点(现在是4),形成了完整的反转链接结构。
内容由零声教学AI助手提供,问题来源于学员提问