电话:0731-83595998
导航

考试心得:09考研数据结构试题解法

来源: 2017-12-13 14:38

   今天去网上看了一下09年的考研试题,看见该题目(图片):

 


  先来定义结点(为了简便,省略set/get):
  public class Node
  {
  public int data;
  public Node link;
  }
  我能想到的两种解法,一个基于递归:
  递归版的思路就是,基于当前结点,如果后一个是倒数第K-1,那么当前结点是所求,若不然,返回当前是倒数第几个。
  public int printRKWithRecur(Node head,int k)
  {
  if(k==0||head==null||head.link==null)return 0;
  if(_recurFind(head.link,k)>=k)return 1;
  return 0;
  }
  private final int _recurFind(Node node, int k) {
  if(node.link==null)
  {
  return 1;
  }
  int sRet=_recurFind(node.link,k);
  if(sRet==k-1)
  {
  System.out.println("Got:"+node.data);
  return k;
  }
  return sRet+1;
  }
  对每个结点,该算法都只访问一次,因此复杂度O(N)。
  第二解法,相对递归来说,这种方法可以算是消除递归版,而且从某种意义上来说比递归更高效,跟省空间,递归版实际上是把回溯的数据存在栈上,而版方法是自己存储,且利用数组实现一个循环队列,只存储K个元素。
  public static class CycleIntQueue
  {
  int datas;
  int top=0;
  int num=0;
  public CycleIntQueue(int n)
  {
  datas=new int[n];
  }
  public void push(int i)
  {
  datas[(top++)%datas.length]=i;
  num++;
  }
  public int numPushed()
  {
  return num;
  }
  public int getButtom()
  {
  return datas[top%datas.length];
  }
  }
  public int printRKWithCycleQueue(Node head,int k)
  {
  if(k==0||head==null)return 0;
  CycleIntQueue queue=new CycleIntQueue(k);
  Node cur=head.link;
  while(cur!=null)
  {
  queue.push(cur.data);
  cur=cur.link;
  }
  if(queue.numPushed()

编辑推荐:

下载Word文档

温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)

网络课程 新人注册送三重礼

已有 22658 名学员学习以下课程通过考试

网友评论(共0条评论)

请自觉遵守互联网相关政策法规,评论内容只代表网友观点!

最新评论

点击加载更多评论>>

精品课程

更多
10781人学习

免费试听更多

相关推荐
图书更多+
  • 电网书籍
  • 财会书籍
  • 其它工学书籍
拼团课程更多+
  • 电气拼团课程
  • 财会拼团课程
  • 其它工学拼团
热门排行

长理培训客户端 资讯,试题,视频一手掌握

去 App Store 免费下载 iOS 客户端