Reverse a singly linked list.(反转一个单链表)
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?(反转链表可以通过迭代或递归实现)
1.个人解法(迭代)
ListNode* reverseList(ListNode* head)
{
if(!head)
return NULL;
ListNode *pre, *q, *tmp;
pre = q = head;
tmp = NULL;
while(q)
{
tmp = q ->next;
q ->next = pre;
pre = q;
q = tmp;
}
head ->next = NULL;
head = pre;
return head;
}
2.参考解法(递归)
ListNode* reverseList2(ListNode* head)
{
if(head == NULL || head->next == NULL)
return head;
ListNode *p = reverseList2(head->next);
head->next->next = head;
head->next = NULL;
return p;
}
3.总结
第一种是循环迭代解法,时间和空间复杂度分别为O(n),O(1);第二种是递归解法,时间和空间复杂度分别为O(n),O(n)。递归的实现代码很简洁,但比迭代方法多了O(n)的隐性栈空间。虽然自己实现了迭代法,但没有成功实现递归法,说明自己对递归还没有一个清晰的认识。
PS:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- “个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。