1.剑指offer24.反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
限制:0 <= 节点个数 <= 5000
解题思路:
(1)本人思路:利用递归,和先进后出的思想,将链表反向存储到新链表中。需要注意的是:头或尾部掐掉一次新开空间,可以定义一个整数做标记,便于判定是否新开空间,以及原链表是否为空。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* res = new ListNode;
ListNode* ans = res;
int i = 0;
ListNode* reverseList(ListNode* head) {
if(head!=NULL){
if(head->next!=NULL){
reverseList(head->next);
}
if(i>0){
ans->next = new ListNode;
ans = ans->next;
}
ans->val = head->val;
i++;
}
if(res->val==0&&i==0) res=NULL;
return res;
}
};
(2)官方思路:迭代(双指针)。考虑遍历链表,并在访问各节点时修改 next
引用指向。时间复杂度O(n),空间复杂度O(1)。简而言之就是遍历,逐个调转指针指向。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *cur = head, *pre = nullptr;
while(cur != nullptr) {
ListNode* tmp = cur->next; // 暂存后继节点 cur.next
cur->next = pre; // 修改 next 引用指向
pre = cur; // pre 暂存 cur
cur = tmp; // cur 访问下一节点
}
return pre;
}
};
官方题解来源:剑指 Offer 24. 反转链表(迭代 / 递归,清晰图解) - 反转链表 - 力扣(LeetCode)