题目
- 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
思路
两种思路:
一种是迭代,每次将当前节点和下一个节点表示出来,并且将当前节点指向前一个结点;当迭代到最后一个节点时,即可完成链表的反转。
第二种是递归,当链表为空时或链表到达最后一个节点是返回,创建一个指针来接收反转后链表的头节点,然后将后一个节点指向前一个节点,前一个结点指向空,直到全部完成即可。
这两种思路的区别在于前者是从前往后来改变链表的指向;而后者是从后往前修改链表的指向,并且将前一个结点的指向置空。
代码
一·迭代
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*prev=NULL;
struct ListNode*curr=head;
while(curr){
struct ListNode*next=curr->next;
curr->next=prev;
prev=curr;
curr=next;
}
return prev;
}
二、递归
/**
* 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*node=reverseList(head->next);
head->next->next=head;
head->next=NULL;
return node;
}