【每日一题】反转链表
反转链表
这道是牛客的题,给了链表然后返回链表的新表头。
拿到这道题首先肯定想到的是暴力求解,从表头开始遍历到尾,用尾元素作为新表的表头,然后遍历尾元素的上一个元素,链到新表的最后然后不断重复直到链表的表头链到新表的尾巴
这样有一个很大的问题就是复杂度太高了,时间复杂度是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;
}
};