思路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;}
画个图,其实就很容易理解
