📜  门| GATE-CS-2014-(Set-1)|问题15(1)

📅  最后修改于: 2023-12-03 15:28:43.762000             🧑  作者: Mango

门 GATE-CS-2014-(Set-1) 问题15

这是一个考察链表的面试题。

问题

给定一个链表,写一个函数将链表翻转,并返回反转后的链表。

例子

比如给定链表为 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),因为我们没有使用任何额外的空间。

结论

这是一个非常基本的链表反转问题,并且非常容易实现。在面试中出现的概率也比较高,因此程序员需要熟练掌握。