每日一题——反转单链表

反转单链表

题目链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DEpyMc54-1691204429232)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230805100711512.png)]

下面主要介绍两种方法:


方法一:

利用三个指针变量进行反转

具体过程如图所示:

注意:循环的结束的条件为cur == NULL而不是next == NULL

实现代码:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* newHead = NULL;
    struct ListNode* cur = head;

    while (cur)
    {
        struct ListNode* curNext = cur->next;	//如果next放在循环外面定义,就不好控制循环结束条件

        cur->next = newHead;
        newHead = cur;
        cur = curNext;
    }

    return newHead;
}

方法二:

利用哨兵位实现反转

具体过程如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7c4iaub-1691204429233)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230805105036764.png)]

注1:循环结束的条件为cur->next == NULL

注2:返回之前要将哨兵位释放,防止内存泄露

实现代码:

struct ListNode* reverseList(struct ListNode* head)
{
    //如果链表为空,直接退出,返回NULL
    if (head == NULL)
        return NULL;

    //创建哨兵为
    struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    newHead->next = head;

    //实现反转
    struct ListNode* cur = head;
    while (cur->next)
    {
        struct ListNode* curNext = cur->next;

        cur->next = curNext->next;
        curNext->next = newHead->next;
        newHead->next = curNext;
    }

    //释放哨兵位,返回新的头
    struct ListNode* retHead = newHead->next;
    free(newHead);
    return retHead;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forward♞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值