题目
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思考题:
请同时实现迭代版本和递归版本。
样例
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL

解法一:迭代

建立一个新的链表,头插法即可

  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. auto h = new ListNode(-1), p = head;
  13. while (p) {
  14. auto q = p->next;
  15. p->next = h->next;
  16. h->next = p;
  17. p = q;
  18. }
  19. return h->next;
  20. }
  21. };

解法二:递归

函数能做到每次将一段链表反转,我们这里只能选取head->next
那么经过递归后,返回的是已经反转的链表头,也就是原链表的最后一个结点
最后,我们需要让head->next指向head,head指向nullptr
注意递归的边界条件:head或者head->next为nullptr

  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 || !head->next) return head;
  13. auto h = reverseList(head->next);
  14. head->next->next = head;
  15. head->next = nullptr;
  16. return h;
  17. }
  18. };