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

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

一、问题描述

二、解题思路分析

通过三个指针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是原链表的尾节点,反转后的首节点
    }    
}

 

相关文章
|
3天前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
3天前
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
3天前
|
存储 算法 C语言
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
|
2天前
|
算法 Java
Java数据结构与算法:双向链表
Java数据结构与算法:双向链表
|
2天前
|
算法 Java
Java数据结构与算法:循环链表
Java数据结构与算法:循环链表
|
3天前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
3天前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
16 5
|
4天前
|
算法
【C/数据结构和算法】:栈和队列
【C/数据结构和算法】:栈和队列
14 1
|
8天前
|
C++
【洛谷 P1044】[NOIP2003 普及组] 栈 题解(递归+记忆化搜索)
**NOIP2003普及组栈问题**:给定操作数序列1到n,仅允许push(进栈)和pop(出栈)操作。目标是计算所有可能的输出序列总数。输入包含一个整数n(1≤n≤18)。示例输入3,输出5。当队列空时返回1,栈空则只能入栈,栈非空时可入栈或出栈。AC C++代码利用记忆化搜索求解。
9 1
|
1天前
|
存储 人工智能 程序员
技术心得记录:堆(heap)与栈(stack)的区别
技术心得记录:堆(heap)与栈(stack)的区别