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