刷题:牛客JZ24 反转链表

110 阅读1分钟

网址: www.nowcoder.com/practice/75…

描述

给定一个单链表的头结点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}。

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead==nullptr || pHead->next==nullptr)   //无结点或单个结点
            return pHead;
        ListNode* flag=pHead->next;   //要操作的结点,从第二个结点开始操作
        ListNode* left=pHead;   //要操作的结点的前一个结点
        ListNode* right=flag->next;   //要操作的结点的下一个结点
        pHead->next=nullptr;   //把第一个结点的next置为空
        while(flag)
        {
            flag->next=left;   //进行操作
            left=flag;   //左边右移一位
            flag=right;   //中间右移一位
            if(right)
            right=right->next;   //后边右移一位
        }
        return left;
    }
};

总结:

用三个指针进行删除。
访问空指针的next会发生栈溢出,所以right指针右移前要判断是否为空。