剑指 Offer II 024. 反转链表 - 力扣(LeetCode)
直接上代码
基础版
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
//普通翻转
//我们根本不需要进行此判断,一般要进行这种判断的都是递归的情形,
//就算不进行这种判断也是可以的
//if(head==NULL||head->next==NULL)
//return head;
//最后返回的是现在尾部的指针
//进行翻转需要记录上一个节点
struct ListNode* last=NULL;
while(head)
{
struct ListNode* next=head->next;
head->next=last;
last=head;
head=next;
}
//最后的时候head为空,最后返回的就是last
return last;
}
提升版
我们需要记住的是深度优先,先走到最后的位置在进行其他的操作,因为你想啊,如果我们需要进行链表的翻转是不是最后的结果是从后向前,那么我们递归的时候也应该先对最后的进行操作,
然后我们每次返回的都应该是翻转后的链表的头结点,翻转方式如上。
struct ListNode* reverseList(struct ListNode* head)
{
if(head==NULL||head->next==NULL)
return head;
struct ListNode* newphead=reverseList(head->next);
head->next->next=head;
head->next=NULL;
return newphead;
}