【数据结构与算法 经典例题】反转链表(图文详解)

简介: 【数据结构与算法 经典例题】反转链表(图文详解)

一、问题描述

二、解题思路分析

通过三个指针n1,n2,n3来实现链表的反转

1.首先初始化 n1为空    n2指向head     n3指向head->next

2.然后  让n2的next指针指向n1 完成第一步反转

3. 接下来移动三个指针
n1指向n2
n2指向n3
n3指向n3的下一个节点

4.然后
让n2的next指针指向n1 完成反转

5.循环执行反转和移动指针的过程 直到
n3指向空
n2指向最后一个节点
n1指向倒数第二个节点

6.此时再执行最后一次反转 最后一个节点的next指针指向倒数第二个节点

7.最后一次移动节点
n1指向n2(最后一个节点)
n2指向n3(null)
n3此时已经为空,不能解引用
所以n3指针的移动,要加一个判空的条件
n2作为循环结束的条件
而循环结束时,n1刚好停留在原链表的尾节点,也就是新链表的首节点

三、代码实现

struct ListNode* reverseList(struct ListNode* head) 
{
    if (head == NULL)
      return head;//对空链表做特殊处理
    else
    {
      struct ListNode* n1, * n2, * n3;
        n1 = NULL;
        n2 = head;
        n3 = n2->next;
      while (n2)//当n2指向空时,链表节点已经遍历完成,next指针修改完成
      {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if (n3)//对n3判空,防止对空指针解引用
          n3 = n3->next;
      }
      return n1;//当循环结束时,n1是原链表的尾节点,反转后的首节点
    }    
}

 

相关文章
|
6天前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
28天前
|
存储 Java 索引
【数据结构】链表从实现到应用,保姆级攻略
本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
42 10
【数据结构】链表从实现到应用,保姆级攻略
|
2月前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
2月前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
2月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
2月前
|
存储 测试技术
【初阶数据结构篇】双向链表的实现(赋源码)
因为头结点的存在,plist指针始终指向头结点,不会改变。
|
2月前
|
存储 测试技术
【初阶数据结构篇】单链表的实现(附源码)
在尾插/尾删中,都需要依据链表是否为空/链表是否多于一个节点来分情况讨论,目的是避免对空指针进行解引用造成的错误。
|
2月前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
13 0
|
2月前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
13 0
|
2月前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
15 0
下一篇
无影云桌面