首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【数据结构与算法 经典例题】反转链表(图文详解)

【数据结构与算法 经典例题】反转链表(图文详解)

作者头像
倔强的石头_
发布2024-12-06 18:59:52
发布2024-12-06 18:59:52
3040
举报
文章被收录于专栏:C/C++指南C/C++指南

一、问题描述

二、解题思路分析

通过三个指针n1,n2,n3来实现链表的反转

1.首先初始化 n1为空 n2指向head n3指向head->next

2.然后 让n2的next指针指向n1 完成第一步反转

3. 接下来移动三个指针 n1指向n2 n2指向n3 n3指向n3的下一个节点

4.然后 让n2的next指针指向n1 完成反转

5.循环执行反转和移动指针的过程 直到 n3指向空 n2指向最后一个节点 n1指向倒数第二个节点

6.此时再执行最后一次反转 最后一个节点的next指针指向倒数第二个节点

7.最后一次移动节点 n1指向n2(最后一个节点) n2指向n3(null) n3此时已经为空,不能解引用 所以n3指针的移动,要加一个判空的条件 n2作为循环结束的条件 而循环结束时,n1刚好停留在原链表的尾节点,也就是新链表的首节点

三、代码实现

代码语言:javascript
复制
struct ListNode* reverseList(struct ListNode* head) 
{
    if (head == NULL)
	    return head;//对空链表做特殊处理
    else
    {
	    struct ListNode* n1, * n2, * n3;
        n1 = NULL;
        n2 = head;
        n3 = n2->next;
	    while (n2)//当n2指向空时,链表节点已经遍历完成,next指针修改完成
	    {
		    n2->next = n1;
		    n1 = n2;
		    n2 = n3;
		    if (n3)//对n3判空,防止对空指针解引用
			    n3 = n3->next;
	    }
	    return n1;//当循环结束时,n1是原链表的尾节点,反转后的首节点
    }    
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题描述
  • 二、解题思路分析
  • 三、代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档