每日一题---OJ题5: 反转链表

嗨! 小伙伴们,我们又见面啦,今天由我来带大家一起看看这道OJ题----反转链表

c360e45714964559ae5ebfac4309d634.png

咋一看,这题目好像听起来挺简单的,我们一起来分析分析!

思路一: 我们定义3个变量,分别为n1,n2,n3,分别记录前驱结点,当前结点,后继结点,改变原链表指针的指向。n1指向NULL, n2指向头结点, n3指向头结点的下一个结点。

867a71ff955240618e5067940843e5a6.png

第一次反转:

第一步: 我们先判断n2是否为空,如果不为空,那么修改n2的next指针,将n2的next指针指向n1(n2->next = n1)

48bb81faa3a0468998d6853e135570e9.png

第二步:  让n2赋给n1, n3赋给n2,如果n3不是NULL,那么n3->next赋给n3

5c274cfca197409999b8a3ecfbe36a3a.png

我们再来判断: n2的next指针是否为空,如果非空,n2->next = n1, 然后n2赋给n1, n3赋给n2,如果n3不是NULL,那么n3->next赋给n3

第二次:

35464a2c5cee4a7f844f5b81469f850d.png

第三次:

02d3b6e8d17243728c15468e1fe0d60a.png

第四次:

2f50165353c44320a4bcf4fc755591c6.png

第五次:

请注意: 第5次循环的时候,n3已经为NULL,所以不会执行 n3 = n3->next 这条语句。

d78120b2bc9f4aa2b5cc9890a695deff.png

 

当n2==NULL时,跳出while循环,而n1恰好是链表的头结点,返回n1。

整体代码如下:

这里有一点请注意: 传过来的测试用例的head有可能为空,因此我们需要判断头结点是否为空的情况。

e889e02b5c65473bbfe8cab3804fe1dd.png

typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
       if(head == NULL){
        //如果头结点为空,则返回头结点
        return head;
       }

       ListNode* n1 = NULL;
       //定义一个n1变量,n1指向NULL
       ListNode* n2 = head;
       //定义一个n2变量,n2指向头结点
       ListNode* n3 = head->next;
       //定义一个n3变量,n3指向头结点的下一个结点

       while(n2 != NULL){
        n2->next = n1;//n2用来改变原链表指针指向
        n1 = n2;      //把n2赋给n1
        n2 = n3;      //把n3赋给n2
        if(n3){
    //如果n3不为NULL
        n3 = n3->next;//把n3->next赋给n3
        }
    }
    return n1;         //n1恰好是新的头结点
}

好啦,今天的讲解就到这里啦,我们下期再见!

 

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值