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;
}看到这里了,就来个三连吧,求求啦!(超大声!)(三连:点赞,收藏+关注)



















