leetcode-JZ24

题面

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000

原题链接

分析

第一类做法

把链表遍历一遍,把变量存储起来,然后反过来建立一个新链表

这种做法很简单,可以用vector,也可以定义一个特定大小的数组。但是并不推荐,因为等于遍历了两次链表,还需要把链表中所有遍历存储起来。

时间复杂度:O(n)

空间复杂度:O(n)

第二类做法(推荐)

只遍历一次链表,遍历的过程中,就把指针指向改过来

这种做法有一个容易疏漏之处,即必须把链表第一个节点的next值设为NULL,否则,就像狗咬着自己的尾巴转圈,链表会无限长。

时间复杂度:O(n)

空间复杂度:O(1)

源代码(注释部分即为思路)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        //特判
        if(head==NULL){
            return head;
        }
        
        ListNode* now = head->next;
        ListNode* pre = head;
        ListNode* later = head;
        //这一步极其重要,我就是在这一步卡了半个小时
        pre->next = NULL;
        
        while(now != NULL){
            later = now->next;
            //更改指针方向
            now->next = pre;
            
            pre = now;
            now = later;
            
        }
        //最终now的值必然为NULL
        return pre;
    }
    
};

你可能感兴趣的:(c++)