[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;
  
}
相关推荐
松涛和鸣9 分钟前
DAY33 Linux Thread Synchronization and Mutual Exclusion
linux·运维·服务器·前端·数据结构·哈希算法
仰泳的熊猫14 分钟前
1083 List Grades
数据结构·c++·算法·pat考试
Tan_Zhixia28 分钟前
时间复杂度判断
数据结构·c++·算法
☆cwlulu34 分钟前
C/C++ 内存分配函数详解
c语言·c++
hweiyu002 小时前
数据结构:布隆过滤器
数据结构
超级大福宝3 小时前
C++ 中 unordered_map 的 at() 和 []
数据结构·c++
仰泳的熊猫3 小时前
1037 Magic Coupon
数据结构·c++·算法·pat考试
AI科技星3 小时前
质量定义方程的物理数学融合与求导验证
数据结构·人工智能·算法·机器学习·重构
程芯带你刷C语言简单算法题3 小时前
Day30~实现strcmp、strncmp、strchr、strpbrk
c语言·学习·算法·c
hweiyu003 小时前
数据结构:并查集
数据结构