剑指offer题解(C语言)----JZ24 反转链表/单链表的原地置逆

这篇博客介绍了如何在O(1)的空间复杂度和O(n)的时间复杂度下,使用C语言实现单链表的原地反转。通过设置三个指针cur、pre和next,逐步更新每个节点的next指针,使其指向其前一个节点,最终返回新的头节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围:0≤n≤1000

要求:空间复杂度 O(1) ,时间复杂度 O(n) 。

解析

观察到空间复杂度为O(1),也就是说不允许我们开辟新的内存空间,也就是要求链表原地置逆。既然不能开辟新的内存空间,就只能通过操作指针来完成原地置逆的操作。

最开始想到的应该是将next指针指向当前结点的前一个结点,那又该如何找前一个结点呢?

可以在最开始将cur指针指向头结点,pre指针指向空,这样cur->next操作以后就是一个指向null的指针,而pre则指向cur,cur指向cur->next,完成了一次反转以及遍历后移。

对以后的每一位都实现这样的操作,即保存cur->next,反转,pre后移,cur后移,直到cur指向null时,遍历完整个链表,返回当前的头结点,即pre的值。

代码

struct ListNode* ReverseList(struct ListNode* pHead ) {
    struct ListNode*cur=pHead; //将cur指针指向头结点
    struct ListNode*pre=NULL; //pre指针指向cur的前一个结点,即NULL
    struct ListNode*next=NULL; //next指针初始化指向哪里无所谓,之后会重新赋值
    while(cur){
        next=cur->next; //用next先保存cur的后继,防止后来找不到cur->next
        cur->next=pre; //反转,即将原先后继的指针指向当前结点的前一个结点
        pre=cur; //pre指针后移一位,移动到cur的位置
        cur=next; //cur指针后移一位,移动到next的位置
    }
    return pre;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值