206. 反转链表

反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

解题思路 1 (用栈)

用栈把链表结点依次放入栈中,放完之后,再依次从链表中取出结点,并把当前结点的next指针指向下一个结点**

  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. stack<ListNode*> listStack;
  5. ListNode* pre = head;
  6. if(head == NULL)
  7. return NULL;
  8. ListNode* post = head->next;
  9. pre->next = NULL;
  10. while(post != NULL){
  11. ListNode*lp = post->next;;
  12. //在链表上行走的前后指针
  13. post->next = pre;
  14. pre = post;
  15. post = lp;
  16. }
  17. return pre;
  18. }
  19. };

解题思路 2 (前后指针迭代)

用一个 post 指针和一个 pre 指针,它们的关系是 post = pre->next, 用这两个指针遍历链表,遍历过程中不断将 post 的指针反转为指向 pre, 即 post->next = pre ,从而达到最后反转整个链表
具体如下:
206. 反转链表 - 图1
初始时,pre 指针指向 NULL, post 指针指向 head 结点
用一个临时变量 temp保存post的下一个结点,即 temp = post->next ,即图中的 a1 结点
然后把 post 的 next 指针调整为post->next = pre
更新 pre 为此时的 post , 即 pre = post 相当于 pre 向前移了一步,走到图中 head 结点
更新 post 为 temp , 即 post = temp , post 也向前移了一步,走到图中 a2 结点
依次类推不断迭代**

  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. ListNode* pre = NULL;
  5. ListNode* post = head;
  6. ListNode* lp;
  7. while(post != NULL){
  8. lp = post->next;;
  9. //在链表上行走的前后指针
  10. post->next = pre;
  11. pre = post;
  12. post = lp;
  13. }
  14. return pre;
  15. }
  16. };

解题思路 3 (递归)

参考 动画演示+多种解法 206. 反转链表

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* reverseList(ListNode* head) {
  12. if( head == NULL || head->next == NULL)
  13. return head;
  14. ListNode* cur = reverseList(head->next);
  15. head->next->next = head;
  16. head->next = NULL;
  17. return cur;
  18. }
  19. };