[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;
  
}
相关推荐
NineData1 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
RuoZoe4 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
祈安_7 天前
C语言内存函数
c语言·后端
norlan_jame9 天前
C-PHY与D-PHY差异
c语言·开发语言
琢磨先生David9 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
czy87874759 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
m0_531237179 天前
C语言-数组练习进阶
c语言·开发语言·算法
qq_454245039 天前
基于组件与行为的树状节点系统
数据结构·c#
超级大福宝9 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
岛雨QA9 天前
常用十种算法「Java数据结构与算法学习笔记13」
数据结构·算法