LeetCode:206反转链表

206. 反转链表 - 力扣(LeetCode)

不难,小细节是单写一个循环,把特殊情况包含进去,

单链表核心:上一个结点,当前结点,下一个结点,

代码:+注释(算是最优解,不及格的)时O(n),空O(1)

对于另一种的递归方法有点拉跨 时O(n)空O(n)(在博主看来能循环做的基本就能递归做,而递归能做的循环不一定能做)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head) {
    //assert(head);
    if(head == NULL){
        return head;
    }
    struct ListNode* ptmp2 = NULL;
    struct ListNode* ptmp1 = head;
    //第一次有些特殊,要置一个ptail->next = NULL来作为新链表的尾
    //写的不好,不如官方题解,把这第一种情况给塞进循环(还少了head == NULL这种情况的判断)
    //可以自己去链接里看官方题解,就是本代码的ptmp1 最开始置NULL来操作的
    head = head->next;
    ptmp1->next =NULL;
    while(head){
        ptmp2 = head->next;
        head->next = ptmp1;
        ptmp1 = head;
        head = ptmp2;
    }
    return ptmp1;
}

官方解法(相对于上面的是优化的)时O(n)空O(1)

这种做法就是最好的,博主犯病搞多了变量,虽然差距不大,但是不优雅了,悲,

 

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* pReturn = NULL;
    while(head){
        struct ListNode* next = head->next;//写在这里,避免head为NULL造成的越界访问
        head->next = pReturn;
        pReturn = head;
        head = next;
    }
    return pReturn;
}

看到这里了,就来个三连吧,求求啦!(超大声!)(三连:点赞,收藏+关注)

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值