剑指offerJZ24

问题:

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: n\leq1000n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。

如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode *pre = nullptr;//初始化三个指针,pre表示已经反转的链表的最后一个
        ListNode *cur = pHead;//cur表示等着反转的第一个
        ListNode *nex = nullptr;//nex表示等待反转的第二个
        while(cur){
            nex = cur->next;
            cur->next=pre;
            pre=cur;
            cur=nex;
            
        }
        return pre;

    }
};

nex = cur->next;表示转链前的保存,不需要删除节点,只是反链输出而已
cur->next=pre;表示将即将反转的第一个节点的下个指针转到已经反转的链表的最后一个节点
pre=cur;指针后移,准备操作接下来的节点
cur=nex;
加一个循环就ok
更详细:在这里

上一篇:LeetCode143 重排链表


下一篇:链表问题