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 );
    }

  • 相关阅读:
    js压缩图片上传插件localResizeIMG
    valueOf函数详解
    垂直居中
    word-wrap,word-break,white-space
    理解bind函数
    float失效的情况
    塞码考试系统里的输入,到底是怎么回事
    理解position:relative
    border实现三角形的原理
    函数是对象,函数名是指针
  • 原文地址:https://www.cnblogs.com/AndyJee/p/3793631.html
Copyright © 2011-2022 走看看