描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤10000\leq n\leq10000≤n≤1000
要求:空间复杂度 O(1)O(1)O(1) ,时间复杂度 O(n)O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例:
输入:{1,2,3}
输出:{3,2,1}
struct ListNode* ReverseList(struct ListNode* pHead ) {
// write code here
// 头结点为第一个结点 pHead
//当为空、或者 只有一个元素时直接退出
if(pHead == NULL)
return NULL;
if(pHead->next == NULL)
return pHead;
//至少两个元素时
//定义两个空指针
struct ListNode *p = NULL;
struct ListNode *temp = NULL;
//p是第二个结点 断开头结点指向空
p = pHead->next;
pHead->next = NULL;
//第二个结点的下一个结点不为空
while(p->next != NULL)
{
//不为空 ,则 temp记录p的下一个结点
temp = p->next;
//结点p 指向头结点
p->next = pHead;
//p设置为头结点
pHead = p;
//把p 拉回来
p = temp;
}
//退出时 p 是最后一个结点 也是最终目标链表头结点
//p 指向头结点
p->next = pHead;
//p设置为头结点
pHead = p;
//返回 pHead
return pHead;
}