OJ题训练(二)

反转链表

题目来源

  牛客网

题目描述

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

数据范围: 0≤n≤10000≤n≤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) {
    
    
		if(pHead == nullptr || pHead->next == nullptr)
			return pHead;

		ListNode* ans = ReverseList(pHead->next);
		pHead->next->next = pHead;
		pHead->next = nullptr;

		return ans;
    }
};
图解

在这里插入图片描述

  递归的问题是如果数据过大,可能会栈溢出,空间开销比较大。

题解二(双指针)

class Solution {
    
    
public:
    ListNode* ReverseList(ListNode* pHead) {
    
    
		if(pHead == nullptr || pHead->next == nullptr)
			return pHead;
			
		ListNode* cur = pHead;
		ListNode* pre = pHead->next;
		pHead->next = nullptr;

		while(pre != nullptr)
		{
    
    
			ListNode* next = pre->next;
			pre->next = cur;
			cur = pre;
			pre = next;
		}

		return cur;
    }
};
图解

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_47658735/article/details/130990916