📅  最后修改于: 2023-12-03 15:28:43.762000             🧑  作者: Mango
这是一个考察链表的面试题。
给定一个链表,写一个函数将链表翻转,并返回反转后的链表。
比如给定链表为 1 -> 2 -> 3 -> 4 -> NULL
,翻转后的链表应该为 4 -> 3 -> 2 -> 1 -> NULL
。
思路比较直观:我们从头开始遍历链表,每次将当前节点的 next
指针指向上一个节点即可。
具体实现上,我们需要定义两个指针,一个指向当前节点,一个指向上一个节点。初始化时,当前节点为头节点,上一个节点为 NULL
。
执行反转操作:循环遍历链表,让当前节点的 next
指向上一个节点,再将上一个节点更新为当前节点,当前节点更新为下一个节点。
最后我们返回上一个节点,它已经变成了翻转后的链表的头节点。
实现代码如下:
struct node* reverseList(struct node *head)
{
struct node *current = head, *prev = NULL, *next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
时间复杂度是 O(n)
,因为我们只需要遍历整个链表一遍即可。
空间复杂度是 O(1)
,因为我们没有使用任何额外的空间。
这是一个非常基本的链表反转问题,并且非常容易实现。在面试中出现的概率也比较高,因此程序员需要熟练掌握。