前言
- 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。
- 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 牛客数据结构题目位置如下:
目录
- 前言
- 问题描述:
- 举例:
- 解法思路1:
- 代码结果1:
- 解法思路2:
- 代码结果2:
- 结束语
问题描述:
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:0≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
举例:
//例1:
//输入:
{1,2,3}
//返回值:
{3,2,1}
//============
//例2:
//输入:
{}
//返回值:
{}
//说明:空链表则输出空
解法思路1:
- 直接使用最后一个结点当做头结点
代码结果1:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* @param pHead ListNode类
* @return ListNode类
*/
struct ListNode* ReverseList(struct ListNode* pHead )
{
//如果只有一个结点 或者 无结点 返回本身
if(pHead->next == NULL || pHead == NULL)
{
return pHead;
}
struct ListNode *p,*q;
p = pHead;
//q指向最后一个结点 p指向倒数第二个结点
while(p)
{
if(p->next->next == NULL)
{
q = p->next;
break;
}
p = p->next;
}
q->next = NULL;
p->next = NULL;
//头插法
while(pHead)
{
p = pHead;
pHead = pHead->next;
p->next = q->next;
q->next = p;
}
return q;
}
解法思路2:
- 创建头结点
代码结果2:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* @param pHead ListNode类
* @return ListNode类
*/
struct ListNode* ReverseList(struct ListNode* pHead )
{
//若pHead 不存在 在直接返回pHead
if(!pHead) return pHead;
//创建一个头结点
struct ListNode *L = (struct ListNode*)malloc(sizeof(struct ListNode));
L->next = NULL;
struct ListNode *p;
p = pHead;
//头插法
while(p)
{
struct ListNode *q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
return L->next;
}
结束语
- 以上就是C数据结构栈实现反转链表的内容。可以在牛客尝试刷几道题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。