题目描述
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
解题
解法一:使用头插法
第一想法就是使用头插法 很好理解 按照1,2,3,4的顺序进行头插 得到的实际链表顺序是 4,3,2,1
这不就是逆转吗?
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//创建虚拟头结点
ListNode*dummy=new ListNode();
//使用头插法,p指向马上要插的元素,q指向未插部分的首元素
ListNode*p=head,*q=head;
while(q){
p=q;
q=q->next;
p->next=dummy->next;
dummy->next=p;
}
return dummy->next;//注意这里不要直接返回虚拟结点!
}
};
要注意我们会用到两个指针,一个是用于进行头插,一个是记录待插部分链表的头结点!
解法二:直接在原链表上进行操作
直接逆转原链表的指针指向
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode*pre,*current,*temp;
pre=NULL;
current=head;
while(current){
temp=current->next;
current->next=pre;
pre=current;
current=temp;
}
return pre;
}
};
解法三:将解法二用递归方式进行书写
class Solution {
public:
ListNode* reverseList(ListNode* head) {
return reverse(NULL,head);
}
ListNode*reverse(ListNode*pre,ListNode*current){
if(current==NULL)return pre;
ListNode*temp=current->next;
current->next=pre;
return reverse(current,temp);
}
};