c 语言实现链表反转(超详细,有手就行)

简介: 我们在对数组进行反转的时候,通常定义俩个指针,一个指向首元素,一个指向尾元素,然后借助一个中间变量,将俩者交换,然后首元素++;尾元素--;重复操作直到头元素大于等于尾元素。

题目描述如下:



16b96b7752fd4045a25ca2dd2dba880c.png

思路分析:



我们在对数组进行反转的时候,通常定义俩个指针,一个指向首元素,一个指向尾元素,然后借助一个中间变量,将俩者交换,然后首元素++;尾元素--;重复操作直到头元素大于等于尾元素。


但链表不同,它的空间是动态分配,即地址不一定是连续的。


那么如何实现呢?


头插


我的想法是用三个指针,先分别记录下前面三个的结点。即pre ,cur,next;


先将pre ->next=NULL;然后cur->next=pre ,这个时候我们实现了第一次头插,接下就是我们最喜欢的喜欢的过程了,将pre,cur,next这三个值更改,进行循环


即pre=cur,cur=next,next=next->next;


什么时候结束循环呢?那就是cur=NULL结束,但我们需要在对代码按上述操作的时候还需要一些小技巧!为什么?因为cur 为NULL时,在上一次循环中,next已经为NULL,我们接着操作next=next->next;是一个不合理的操作,即

8e12508bc32b44ce9aa3a277a8435620.png

在这里我们可以用一个判断来进行;如果next!=NULL;我们才next=next->next; 这样就可以异常(由于next=next->next   是为下一次循环做铺垫的,故对于最后一次没影响在里面)


画图分析是一个程序员不可忽视的一部分,我们下面通过图来描述下我的思路吧!

39795fbb034844d9b467893402c62da9.png

b70c8a66f6624864aeb76e15072c204c.png

0ca1d9c868a44e288b843c9c77c91dd5.png

18af5da7bf624acb80626dd53acfbce7.png

这就是我描述的过程。

这也是基本情况之一,我们还应该注意,如果链表中无数据,或者只有一个数据是不需要进行操作!


以下是代码实现:



/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
struct ListNode* ReverseList(struct ListNode* phead)
{
  if (phead == NULL)   //如果是空链表直接返回NULL
    return NULL;
  if (phead->next == NULL) //如果是只有一个结点的就把头返回就好了
    return phead;
  struct ListNode* pre = phead;
  struct ListNode* cur = phead->next;
  struct ListNode* next = cur->next;
  pre->next = NULL;//头插
  while (cur!=NULL)
  {
    cur->next = pre;
       pre=cur;
    cur = next;
    if(next!=NULL)//异常处理
    next = next->next;
  }
  return pre;
}


相关文章
|
2月前
|
C语言
对链表使用插入排序的C语言实现示例
对链表使用插入排序的C语言实现示例
|
2月前
|
存储 编译器 C语言
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
25 0
|
2月前
|
C语言
C语言循环链表讲解
C语言循环链表讲解
27 0
|
2月前
|
存储 C语言
C语言线性链表讲解
C语言线性链表讲解
27 0
|
2月前
|
存储 C语言
C语言双向链表讲解
C语言双向链表讲解
24 0
|
20天前
|
存储 缓存 前端开发
【数据结构/C语言】深入理解 双向链表
【数据结构/C语言】深入理解 双向链表
|
13天前
|
存储 数据管理 C语言
C语言实战 | 使用链表完成“贪吃蛇”游戏
【7月更文挑战第1天】整体思维,即系统思维,强调以整体视角理解事物。在编程中,结构体体现这种思想,将相关变量打包处理。示例展示了如何用链表而非数组实现“贪吃蛇”游戏,链表提供了更灵活的动态数据管理。一系列代码图片详细描绘了链表结构体在游戏中的应用,包括节点定义、移动、碰撞检测等,凸显了使用链表的优势和代码的清晰组织。
17 0
C语言实战 | 使用链表完成“贪吃蛇”游戏
|
1月前
|
算法 C语言
数据结构——单向链表(C语言版)
数据结构——单向链表(C语言版)
24 2
|
2月前
|
存储 C语言 Python
|
2月前
|
存储 C语言
C语言链表详解 & 两类重要链表的实现
本文详细介绍了链表数据结构,包括链表的非连续、非顺序的物理存储和逻辑顺序通过指针链接的概念。文章以C语言实现链表,并计划更新两种链表(无头单向非循环链表和带头双向循环链表)的代码实现。目前提供了链表的逻辑和物理结构图解,帮助读者理解链表的工作原理,强调了画图在学习数据结构中的重要性。此外,文章指出链表的分类有多种组合形式,并预告将对常用类型的链表进行代码实现。
41 3