[C/C++]数据结构 链表OJ题: 反转链表

描述:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表

示例:

方法一: 让链表指向反向

如图所示:

代码思路:

复制代码
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* n1=NULL;
    struct ListNode* n2=head;
    struct ListNode* n3=head->next;

    while(n2)
    {
        //n2指向n1
        n2->next=n1;

        //三个指针向后移动
        n1=n2;
        n2=n3;
        n3=n3->next;
    }
    return n1;
}

这里要注意,上述代码是我们通过画图写出来的大概思路,这里还有特殊情况需要处理一下,

比如:

  • struct ListNode* n3=head->next;
  • n3=n3->next;

开始并没有判断head和n3指针是否为空,直接引用next可能会导致错误

正确代码:

复制代码
struct ListNode* reverseList(struct ListNode* head) {
    //空链表反转后还是空链表
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode* n1=NULL;
    struct ListNode* n2=head;
    struct ListNode* n3=head->next;

    while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        //如果n3指向空的话就说明走到链表末尾了,没必要在往后走了
        if(n3)
        n3=n3->next;
    }
    return n1;
}

方法二: 头插法

从开始依次取出结点,按头插法插入,就可以实现链表反转

代码:

复制代码
struct ListNode* reverseList(struct ListNode* head) {
      if(head==NULL)
      {
          return NULL;
      }

    struct ListNode* cur=head;
    struct ListNode* newNode=NULL;

    while(cur)
    {
        struct ListNode*ret=cur->next;
        cur->next=newNode;
        newNode=cur;
        cur=ret;
    }
    return newNode;
  
}
相关推荐
问好眼21 分钟前
《算法竞赛进阶指南》0x04 二分-1.最佳牛围栏
数据结构·c++·算法·二分·信息学奥赛
会编程的土豆39 分钟前
【数据结构与算法】优先队列
数据结构·算法
蓝凌y1 小时前
51单片机之外部中断
c语言·单片机·嵌入式硬件
AF_INET62 小时前
RV1126B开发板学习篇(二)v4l2+mpp编码
c语言·经验分享·音视频·视频编解码·嵌入式软件·rv1126b
minji...2 小时前
Linux 进程信号(二)信号的保存,sigset_t,sigprocmask,sigpending
linux·运维·服务器·网络·数据结构·c++·算法
罗湖老棍子3 小时前
最大数(信息学奥赛一本通- P1549)(洛谷-P1198)
数据结构·算法·线段树·单点修改 区间求最大值
垫脚摸太阳5 小时前
第 36 场 蓝桥·算法挑战赛·百校联赛---赛后复盘
数据结构·c++·算法
Aaswk5 小时前
刷题笔记(回溯算法)
数据结构·c++·笔记·算法·leetcode·深度优先·剪枝
我不是懒洋洋6 小时前
预处理详解
c语言·开发语言·c++·windows·microsoft·青少年编程·visual studio
计算机安禾6 小时前
【数据结构与算法】第14篇:队列(一):循环队列(顺序存储
c语言·开发语言·数据结构·c++·算法·visual studio