给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0\leq n\leq10000≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
输入:{1,2,3}
返回值:{3,2,1}
输入:{}
返回值:{}
说明:空链表则输出空
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution
{public:ListNode* ReverseList(ListNode* pHead) {ListNode* pre = nullptr;ListNode* cur = pHead;ListNode* nex =nullptr; // 这里可以指向nullptr,循环里面要重新指向while (cur) {nex = cur->next;cur->next = pre;pre = cur;cur = nex;}return pre;}
};
我们要将链表反转,那么最开始的头节点就成了尾节点;
反转前头结点,将其反转,那么它的nex成为它的pre;
pre节点会成为nex节点
要做的事情:
1.找到当前节点的下一个节点,(它成为下一次遍历的当前节点);
2.当前节点的nex节点是反转前的pre节点;
3.cur节点反转完,成为pre节点
4.cur节点反转完变为1中找到的下一个节点。
链表的当前节点cur,从头开始遍历,
第一次遍历时,它的pre节点是空,它变成后续节点的pre节点,它的nex节点一直为空(反转之后头变尾,尾的nex为nullptr,);
第二次遍历时,先找下一次要遍历的节点nex,cur节点的nex就是pre,然后确定新的pre 和cur.