【每日一题】反转链表

反转链表

这道是牛客的题,给了链表然后返回链表的新表头。
拿到这道题首先肯定想到的是暴力求解,从表头开始遍历到尾,用尾元素作为新表的表头,然后遍历尾元素的上一个元素,链到新表的最后然后不断重复直到链表的表头链到新表的尾巴
【每日一题】反转链表
这样有一个很大的问题就是复杂度太高了,时间复杂度是o(n*n)这个时候我想到了肯定有简单的办法,利用多指针操控,而且由于次次要断掉其中的链子所以肯定要存起来后面的元素,所以我们用三个指针进行操控
首先要是这个链表为空或只有一个元素直接返回,要是只有两个元素就让next指向表头,表头指空,然后满足我们使用三个指针的条件了
【每日一题】反转链表
这样就解决了复杂度的问题,可是三个指针控制难度还是蛮大的,代码读起来太费劲了,我就想着怎么优化,最后想到了只用两个指针就可以操控的办法
第一步一样,链表为空或者只有一个表头就返回表头
【每日一题】反转链表
这里给出第三种方法的实现

/*
struct ListNode {
 int val;
 struct ListNode *next;
 ListNode(int x) :
   val(x), next(NULL) {
 }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead==NULL)
        {
            return NULL;
        }
        ListNode* ptr = NULL;;
        ListNode* next;
        while(pHead)
        {
            next = pHead->next;
            pHead->next = ptr;
            ptr = pHead;
            pHead = next;
        }
        return ptr;
    }
};