题意:使用循环或递归将链表翻转。
解题方法:
1、循环,定义pre指针和next指针,pre指针指向已翻转的链表,head指针指向未翻转的链表,next指针在翻转节点时储存下一个节点的地址,直到head为空指针,则所有链表已翻转。
复杂度:时间复杂度:O(N),空间复杂度:O(1)。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL;
while (head) {
ListNode* next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
};
2、递归,递归结束条件:当head指向NULL或head->next指向NULL时,返回head,就是指向链表最后一个节点的指针。递归函数返回后,回到上一级递归函数,此时的head为指向最后一个节点的上一个节点的指针,将最后一个节点的next指针指向该节点,讲该节点的next指向NULL,完成最后一个节点的翻转。然后继续向上一级函数递归,依次翻转节点,直到最初的head指针的next指向NULL,完成全链表的翻转。
复杂度:时间复杂度:O(N),空间复杂度:O(1)。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
ListNode* ans = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return ans;
}
};