牛客经典链表题—(NC78)反转链表

满难度系数 * * * * *,此题难度系数 * *
满考频热度 * * * * *,此题热度 * * * * *

1. 题目描述

在这里插入图片描述

2. 题目链接

  1. 牛客题目链接反转链表

3. 题目剖析

  1. 将给出的链表进行反转,并输出新链表的头。
  2. 时间复杂度O(n)。对链表从头开始遍历一边,不重复循环遍历。
  3. 空间复杂度O(1)。不开辟新的链表节点。原地实现。

3.1剖析图示

在这里插入图片描述

3.2 图示详解

  1. Node 初始为空,以便head(cur)反转之后的next指向空。
  2. cur初始为head。
  3. 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. 注释1:先对头指针进行判空。以免Next = Cur->next时造成空指针访问。
  2. 注释2:先将迭代的头部处理好。将各个节点的初始相对位置进行归位
  3. 注释3:实现迭代,过程如上图示。当Next为空时,链表访问完毕。新的头节点为cur,并返回反转后的新头节点。

1.如有错误或者没能理解的地方,请及时评论或者私信,及时修改更新
2.会持续更新相关链表高频题目,分类专栏—数据结构

猜你喜欢

转载自blog.csdn.net/weixin_45313447/article/details/115249141