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