思路1:用栈的方式,用栈存入每个节点
思路2:递归
思路3:双指针,迭代, 既然可以用递归,则也可以用正向迭代的方式。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
栈
ListNode* reverseList(ListNode* head) {
if (!head) return NULL;
std::stack<ListNode*> s;
while(head) {
s.push(head);
head = head->next;
}
ListNode* node = s.top(); s.pop();
ListNode* dummy_node = node;
while(!s.empty()) {
node->next = s.top(); s.pop();
node = node->next;
}
node->next = NULL;
return dummy_node;
}
递归
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr)
return head;
ListNode* tmp = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return tmp;
}
双指针迭代
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr)
return head;
ListNode* pre = nullptr;
ListNode* cur = head;
while(cur) {
ListNode* next_node = cur->next; // 这里要注意先存下一个结点。否则next指向前一个结点时,下一个结点就丢失了。
cur->next = pre; // 改变指向
pre = cur; // pre 指针和 cur 指针迭代
cur = next_node;
}
return pre;
}
画个图,其实就很容易理解