[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;
  
}
相关推荐
李白同学5 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
楼台的春风7 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
夏末秋也凉7 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
王老师青少年编程7 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛
liuyuzhongcc10 小时前
List 接口中的 sort 和 forEach 方法
java·数据结构·python·list
计算机小白一个12 小时前
蓝桥杯 Java B 组之背包问题、最长递增子序列(LIS)
java·数据结构·蓝桥杯
卑微的小鬼12 小时前
数据库使用B+树的原因
数据结构·b树
cookies_s_s12 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
醉城夜风~14 小时前
[数据结构]双链表详解
数据结构
gyeolhada14 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯