链表的从尾到头打印(四种方法)

原创 2017年12月17日 17:16:14

一、单链表从尾到头打印的四种方法。
1、正常从尾到头打印。
用一个尾指针指到最后,尾指针每次前移移位,遇到尾指针则打印。

void EndToFirstPrintNode(SListNode*ps) //正常从尾到头打印
{
    SListNode *cur=ps;
    SListNode *tail=NULL;
    while (ps != tail)
    {
        cur=ps;
        while (tail != cur->_next)
            cur=cur->_next;

        printf("%d ",cur->_data);
        tail=cur;
    }
}

2、用动态顺序表。
先遍历一遍把链表的每个数保存在动态顺序表中,再逆序打印顺序表。

void EndToFirstPrintSListNode(SListNode *ps)  //链表的从尾到头打印,用动态顺序表保存数据。
{
    size_t i = 0;
    while (ps)
    {
         CheckFullSeqlist(&List);  //判容和扩容
         List.data[i++]=ps->_data;  //把链表数据赋给顺序表
         List.size++;
         ps=ps->_next;
    }
    PrintSList(&List);  //打印顺序表
}

3、用递归法打印

void EndToFirstPrintSListNodeR(SListNode *ps)//递归打印
{
    if (NULL != ps->_next) //递归结束条件
        EndToFirstPrintSListNodeR(ps->_next);  //子问题
    printf("%d ",ps->_data);
}

4、用链表逆置的方法打印
先逆置链表,再打印链表

void EndToFirstPrintSListNodeNon(SListNode *ps)  //逆置链表
{
    SListNode *prev;
    SListNode *cur;
    SListNode *tmp;
    cur=ps;  //保存头结点
    prev=cur->_next;  //保存下一个节点
    cur->_next=NULL;  //头结点变为尾节点,next=NULL
    while (NULL != prev)  
    {
        tmp=prev->_next;
        prev->_next=cur;
        cur=prev;
        prev=tmp;
    }
    ps=cur;  //尾节点变为头节点
    SListPrint(ps);  //打印链表
}

二、整体代码。

void EndToFirstPrintNode(SListNode*ps) //正常从尾到头打印
{
    SListNode *cur=ps;
    SListNode *tail=NULL;
    while (ps != tail)
    {
        cur=ps;
        while (tail != cur->_next)
            cur=cur->_next;

        printf("%d ",cur->_data);
        tail=cur;
    }
}
 typedef struct SeqList  //顺序表
  {
      DataType *data;
      size_t size;
      size_t capicity;
  }SeqList;
  SeqList List;

  void CheckFullSeqlist(SeqList *Seq)  //顺序表的判容和扩容
  {
      DataType *tmp;
      if (Seq->size==Seq->capicity)
      {
          tmp=(DataType*)realloc(Seq->data,2*Seq->capicity*sizeof(DataType)+3*sizeof(DataType));
          if (NULL==tmp)
          {
              printf("扩容失败!");
          }
          else
          {
              Seq->capicity=Seq->capicity*2+3;
              Seq->data=tmp;
          }
      }
  }

  void PrintSList(SeqList *Seq)  //打印顺序表
  {
      DataType i=0;
      for (i=Seq->size-1;i>=0;i--)
      {
          printf("%d ",Seq->data[i]);
      }
  }

 void SListPrint(SListNode* pHead)  //打印链表
{
    if (NULL==pHead)
    {
        printf("空链表\n");
    }
    else
    {
        while (pHead)
        {
            printf("%d ",pHead->_data);
            pHead=pHead->_next;
        }
        printf("\n");
    }
}

void EndToFirstPrintSListNode(SListNode *ps)  //链表的从尾到头打印,用动态顺序表保存数据。
{
    size_t i = 0;
    while (ps)
    {
         CheckFullSeqlist(&List);
         List.data[i++]=ps->_data;
         List.size++;
         ps=ps->_next;
    }
    PrintSList(&List);
}

void EndToFirstPrintSListNodeR(SListNode *ps)//递归打印
{
    if (NULL != ps->_next) //递归结束条件
        EndToFirstPrintSListNodeR(ps->_next);  //子问题
    printf("%d ",ps->_data);
}

void EndToFirstPrintSListNodeNon(SListNode *ps)  //逆置链表
{
    SListNode *prev;
    SListNode *cur;
    SListNode *tmp;
    cur=ps;  //保存头结点
    prev=cur->_next;  //保存下一个节点
    cur->_next=NULL;  //头结点变为尾节点,next=NULL
    while (NULL != prev)  
    {
        tmp=prev->_next;
        prev->_next=cur;
        cur=prev;
        prev=tmp;
    }
    ps=cur;  //尾节点变为头节点
    SListPrint(ps);  //打印链表
}

三、运行结果
这里写图片描述
四、链表的逆置这种方法容易出错,大家谨慎使用。

版权声明:本文为博主原创文章,转载请私信博主。

剑指offer--python --c++--从尾到头打印链表

输入一个链表,从尾到头打印链表每个节点的值。 python解法:先将链表中的值插入到序列l中,之后再将序列逆置,则输出序列即可 def printListFromTailToHead(se...
  • suanzhaogao
  • suanzhaogao
  • 2017年05月24日 11:39
  • 486

从尾到头打印链表(java)

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 通常打印是一个只读操作,我们不希望打印时修改内容。 接下来我们想到解决这个问题肯定要遍历链表。遍历的顺序是从头到尾的顺序,可输出的顺...
  • u013238950
  • u013238950
  • 2016年03月03日 10:17
  • 2067

Python :从尾到头打印链表

牛客网上的剑指 offer的在线编程: 题目描述: 输入一个链表,从尾到头打印链表每个节点的值 # -*- coding:utf-8 -*- # class ListNode: # de...
  • Lynette_bb
  • Lynette_bb
  • 2017年06月18日 11:44
  • 638

C语言实现 从尾到头打印链表每个节点的值(链表学习 二)

#include #include #include #define LEN sizeof(struct Student) //初始化链表 struct Student{ long num; ...
  • zpf_nevergiveup
  • zpf_nevergiveup
  • 2017年08月20日 21:24
  • 290

从尾到头打印链表(Java)

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。**解析:很多人第一反应是从头到尾输出将会比较简单,于是自然想到把链表中连接结点的指针反转过来,改变链表的方向即可。但该方法会改变原来链表...
  • IDog149tao
  • IDog149tao
  • 2017年03月23日 19:25
  • 285

JAVA实现从尾到头打印链表(《剑指offer》)

最近在刷《剑指offer》里的编程题,但是网上关于《剑指offer》的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码(当然也有部分是借鉴了网...
  • qq_15062527
  • qq_15062527
  • 2015年10月01日 15:14
  • 2412

<剑指Offer>输入一个链表,从尾到头打印链表每个节点的值---Java版本

//从今天开始,在苦逼写论文的空闲,争取一天做一道题。再此记录,激励自己,希望大家都共勉,有理解错误等希望大家指正 import java.util.ArrayList; import java....
  • u010674768
  • u010674768
  • 2017年03月29日 21:00
  • 280

算法学习记录三(C++)--->从尾到头打印链表每个节点的值

描述 输入一个链表,从尾到头打印链表每个节点的值。 思路对于这种颠倒顺序的问题,我们应该就会想到栈,后进先出。所以,这一题要么自己使用栈,要么让系统使用栈,也就是递归。注意链表为空的情况。时间复杂度为...
  • Deft_MKJing
  • Deft_MKJing
  • 2017年07月31日 15:30
  • 461

【剑指offer】从尾到头打印单链表

题目描述: 输入一个链表,从尾到头打印链表每个节点的值。 输入: 每个输入文件仅包含一组测试样例。 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月05日 10:08
  • 3198

剑指offer-Java-从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 方式1:非递归的实现 public class PrintListReverse{ public static void main ...
  • zcl1359205840
  • zcl1359205840
  • 2016年08月26日 14:47
  • 314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:链表的从尾到头打印(四种方法)
举报原因:
原因补充:

(最多只允许输入30个字)