链表反转问题

简介: 链表反转问题

方法一

实现链表翻转最直接的方法就是:从链表的头部开始遍历每个结点,改变每个结点的指向,即将原本指向下一个结点的指针改为指向上一个结点。

遍历原链表,将结点依次插入到新链表的头部。要完成这一步操作,我们需要新添加两个指针(分别命名为 P 和 tmp):

  • P 指针用于遍历链表,并将遍历到的结点插入到新链表中;
  • tmp 指针永远指向指针 P 所在结点的下一个结点,充当原链表在每次移除头部结点后的新头指针;
List * reverse(List * H)
{
    if(H == NULL || H->next == NULL)
    {
        return H;
    }
    
    List *p = H;            //创建指针p作为遍历链表的指针
    List *newH = NULL;      //创建新链表,用于存储反转的链表  
 
    while(p != NULL)
    {
        List *tmp = p->next;
        p->next = newH;
        newH = p;
        p = tmp;
    }
    return newH;
 
}

方法二

另一种方法较前一种比较复杂,需要使用到递归的思想。


方法一是依次遍历链表,更改每个结点的指向,最后一个结点为翻转链表的头部结点。而方法二则完全倒过来,其实现过程为:先通过递归的思维找到链表的头部,然后再改变每个结点的指向,最终到达链表翻转的目的。

//链表翻转的函数
link *reverseList(link * H){
    //如果指针 H 是否存在
    if(H == NULL || H->next == NULL){
        return H;
    }
    //递归查找新链表的头,找到用赋值给 newH
    link * newH=reverseList(H->next);
    //递归完成后,H 初始状态为 NewH 的上一个结点。
    //在一步步弹栈的过程中,始终另 H 指向的结点作为新链表的最后一个结点
    H->next->next=H;
    //在链接到新链表之后,要割去 H 所指结点与下一结点的联系,否则会使新链表产生环
    H->next=NULL;
    //返回新链表所指头部的指针。
    return newH;
}


相关文章
|
4月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
3月前
|
算法 C++
|
8月前
|
缓存 测试技术
有环链表的处理
【5月更文挑战第7天】该文介绍了链表环的检测和处理方法。使用快慢指针可判断链表是否存在环,相遇点距离等于环入口距离。环的长度可通过相遇时慢指针的步长计算。若两链表相交,它们的尾节点相同。
51 1
有环链表的处理
|
7月前
|
算法
数据结构和算法学习记录——习题-翻转链表(不带表头结点逆置算法、带表头结点的链表逆置算法)
数据结构和算法学习记录——习题-翻转链表(不带表头结点逆置算法、带表头结点的链表逆置算法)
44 0
|
8月前
数据结构——二叉树的遍历【前序、中序、后序】
数据结构——二叉树的遍历【前序、中序、后序】
|
8月前
|
算法
【算法】链表反转
【算法】链表反转
35 0
【Leetcode】反转链表 合并链表 相交链表 链表的回文结构
【Leetcode】反转链表 合并链表 相交链表 链表的回文结构
107 0
|
存储 算法 Java
Java数据结构与算法分析(三)链表(单链表、双链表、环形链表)
通过前篇文章《[数组](https://blog.csdn.net/gozhuyinglong/article/details/109702860)》了解到数组的存储结构是一块连续的内存,插入和删除元素时其每个部分都有可能整体移动。为了避免这样的线性开销,我们需要保证数据可以不连续存储。本篇介绍另一种数据结构:链表。
232 0
|
存储 算法 索引
【数据结构与算法】链表1:移除链表 &设计链表&链表反转(双指针法、递归法)
【数据结构与算法】链表1:移除链表 &设计链表&链表反转(双指针法、递归法)
91 0
|
存储 算法 Java
Java实现有环的单向链表,并判断单向链表是否有环
有一个单向链表,链表当中有可能出现环,就像下图这样。我们如何判断一个单向链表是否有环呢?