题目描述
【leetcode】206. 反转链表( Reverse Linked List )
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
第一次解答
思路
一边遍历一边反转指针指向,为了能够反转,需要保存中间变量。
迭代的方法,时间复杂度O(n),空间复杂度O(1)。
test case:
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *p_next = NULL;
ListNode *p_last = NULL;
while(NULL != head){
p_next = head->next;//暂存
head->next = p_last;//反转当前元素指向
p_last = head;//暂存
head = p_next;//指向下个元素
}
return p_last;
}
};
结果:
第二次解答
思路:
递归,难点是怎么取出最后元素,思路有点巧妙。
参考官方题解
ListNode* reverseList(ListNode* head)表示:
反转从head开始的链表
ListNode* reverseList(ListNode* head->next)表示:
反转从head->next开始的链表
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(NULL == head || NULL == head->next)
return head;
ListNode *end = reverseList(head->next);//反转后续元素
//反转当前元素
head->next->next = head;
head->next = NULL;//为什么要这句?中间元素没问题,但最后一个元素(就是反转前第一个元素)一定要这个
return end;
}
};
结果: