206. Reverse Linked List
题目描述
反转一个单链表
思路
真正反转节点的做法没有想到。
借助栈,反转了链表的数值。
官方解法
- 迭代
在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL;
ListNode* cur = head;
ListNode* next = NULL;
while (cur != NULL) {
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
};
时间O(n)和空间o(1)
- 递归
假设列表的其余部分已经被反转,现在我该如何反转它前面的部分?
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL || head->next==NULL)
return head;
ListNode* p = reverseList(head->next);
head->next->next=head;//一次做一个反转
head->next=NULL;
return p;
}
};