[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;
  
}
相关推荐
冠位观测者2 小时前
【Leetcode 热题 100】208. 实现 Trie (前缀树)
数据结构·算法·leetcode
就爱学编程4 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
kittygilr5 小时前
matlab中的cell
开发语言·数据结构·matlab
落羽的落羽5 小时前
【落羽的落羽 C语言篇】动态内存管理·下
c语言
花心蝴蝶.5 小时前
Map接口 及其 实现类(HashMap, TreeMap)
java·数据结构
taoyong0016 小时前
代码随想录算法训练营第十五天-二叉树-110.平衡二叉树
数据结构·算法
叫我阿呆就好了6 小时前
C 实现植物大战僵尸(一)
c语言·开发语言
柒月的猫6 小时前
求和(2022蓝桥杯A组试题C)
c语言·算法·蓝桥杯
c1assy7 小时前
DP动态规划+贪心题目汇总
数据结构·算法·leetcode·贪心算法·动态规划
代码小将8 小时前
PTA数据结构编程题7-1最大子列和问题
数据结构·c++·笔记·学习·算法