zoukankan      html  css  js  c++  java
  • 【算法】怎样把一个单链表反序?

    主要内容:

    1、循环算法

    2、递归算法

    一、反转单链表之循环算法

    1. 链表有两种:

    • 带头结点的:头结点存储长度信息,头结点的next指向第一个实际节点;
    • 不带头结点的,头结点即第一个节点;
    • 这里使用带头结点的链表;

    2. 需要三个指针,记录当前节点(反转用)、前一个节点、后一个节点(反转之后前进用)。

    代码如下:

    /*
       链表
       1.带头结点的:head里面存放链表长度(或其他信息),head->next指向第一个实际节点;
       2.不带头结点的:head即第一个实际节点
    */

    typedef struct Node
    {
        int data;
        Node * next;
    };

    void reverseList(Node *head)
    {
        if ((head==NULL)||((head->next)==NULL))  return ; //如果head为空,或者头结点指向空节点(链表长度为0),则退出。
        Node *pre,*cur,*next; //cur 记录当前位置,pre记录上一个位置,为cur->next的值;next记录下一个位置,反转后cur不等于cur->next
        cur=head->next;
        pre=NULL; //逆转之后,头结点变为尾节点,其next为Null

        while (cur!=NULL)
        {
           next=cur->next;  //反转后不能再用cur->next,所以先记录下这个节点
           cur->next=pre;  
           pre=cur;
           cur=next;
        }

        head->next=pre;     //cur已经为空,所以pre为尾节点。head->next指向它。
        return ;
    }

    二、反转单链表之递归算法

    代码如下:

    List *reverse( List *oldList, List *newHead = NULL )
    {
        List *next = oldList-> next; //记录上次翻转后的链表
        oldList-> next = newHead; //将当前结点插入到翻转后链表的开头
        newHead = oldList; //递归处理剩余的链表
        return ( next==NULL )? newHead: reverse( t, newHead );
    }

  • 相关阅读:
    Samba 4.0 RC3 发布
    SymmetricDS 3.1.7 发布,数据同步和复制
    Express.js 3.0 发布,Node.js 的高性能封装
    GIFLIB 5.0.1 发布,C语言的GIF处理库
    jQuery UI 1.9.1 发布
    SVN Access Manager 0.5.5.14 发布 SVN 管理工具
    DynamicReports 3.0.3 发布 Java 报表工具
    HttpComponents HttpClient 4.2.2 GA 发布
    AppCan 2.0 正式发布,推移动应用云服务
    Ruby 2.0 的新功能已经冻结
  • 原文地址:https://www.cnblogs.com/AndyJee/p/3793631.html
Copyright © 2011-2022 走看看