满难度系数
* * * * *
,此题难度系数* *
。
满考频热度* * * * *
,此题热度* * * * *
。
1. 题目描述
2. 题目链接
- 牛客题目链接反转链表
3. 题目剖析
- 将给出的链表进行反转,并输出新链表的头。
- 时间复杂度O(n)。对链表从头开始遍历一边,不重复循环遍历。
- 空间复杂度O(1)。不开辟新的链表节点。原地实现。
3.1剖析图示
3.2 图示详解
- Node 初始为空,以便head(cur)反转之后的next指向空。
- cur初始为head。
- Next为cur的next,Next节点每次先
记录cur的next
,保证迭代的持续进行。
迭代核心代码:(过程如上图示)
Node = Cur;
Cur = Next;
Next = Cur->next;
Cur -> next = Node;
4. 解题代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
1.
2. @param pHead ListNode类
3. @return ListNode类
*/
typedef struct ListNode ListNode;
struct ListNode* ReverseList(struct ListNode* pHead ) {
if(pHead == NULL) //注释1
{
return NULL;
}
//注释二
ListNode* Node = NULL;
ListNode* Cur = pHead;
ListNode* Next = Cur->next;
Cur->next = Node;
//注释3
while(Next)
{
Node = Cur;
Cur = Next;
Next = Cur->next;
Cur -> next = Node;
}
return Cur;
}
5. 代码注释详解
- 注释1:先对头指针进行判空。以免
Next = Cur->next
时造成空指针访问。 - 注释2:先将迭代的头部处理好。将各个节点的
初始相对位置进行归位
。 - 注释3:实现迭代,过程如上图示。当
Next为空时,链表访问完毕
。新的头节点为cur,并返回反转后的新头节点。
1.如有错误或者没能理解的地方,请及时评论或者私信,及时修改更新
。
2.会持续更新相关链表高频题目,分类专栏—数据结构
。