1.双指针
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*pre=NULL;
struct ListNode*curr=head;
struct ListNode* next = NULL;
while(curr){
next=curr->next;
curr->next=pre;
pre=curr;
curr=next;
}
return pre;
}
2.递归
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的。递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就调用下一层,因此,当达到递归终止条件时,首先return的是最底层调用的函数,return之后,继续执行上一层调用该函数之后的代码,此时我们看到的是上一层的情况,当上一层剩余的代码执行完之后,表示上一层的函数也结束,此时再返回上上一层,执行递归代码之后的代码,如此往复循环,直到返回到最上层,结束整个递归过程。在这里举例中,当head=3的时候return head,此时head=3,cur为3,cur这句话不再执行,只需要执行后面未执行的内容,第一次head->next->next=head这句head->next是null,null又指回3,改变了方向,然后删除向右边的指向(个人感觉第一次这个意义不大),然后返回上一层,执行head->next->next=head,也就是2->next=3,3->next返回2,然后再删除向右的节点,以此类推。关于递归可以看这个