206.反转链表

一、双指针

  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. ListNode* temp
  5. ListNode* pre = NULL;
  6. ListNode* cur = head;
  7. while(cur)
  8. {
  9. temp = cur->next;
  10. cur->next = pre;
  11. pre = cur;
  12. cur = temp;
  13. }
  14. return pre;
  15. }
  16. };

二、递归

将整个链表看成两个结点,第一个是头结点,第二个是待翻转的部分(递归调用),每次将头结点的下一个点指向头结点,并将头结点的next指针指向NULL

  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. // 边缘条件判断
  5. if(head == NULL) return NULL;
  6. if (head->next == NULL) return head;
  7. // 递归调用,翻转第二个节点开始往后的链表
  8. ListNode *last = reverseList(head->next);
  9. // 翻转头节点与第二个节点的指向
  10. head->next->next = head;
  11. // 此时的 head 节点为尾节点,next 需要指向 NULL
  12. head->next = NULL;
  13. return last;
  14. }
  15. };