〖JAVE经验〗考试心得:考研数据结构试题解法

先来定义结点(为了简便,省略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()

System.out.println(“Got:”+queue.getButtom());

return 1;

}

本算法,都每个结点也只放一次,另外进行一次入队操作,该操作复杂度O(1),从而,整个算法复杂度仍是O(N).

更多免费相关学习经验请访问:Tore_m_1206686_21115_1_1.html”>http://www.shangxueba.com/sTore_m_1206686_21115_1_1.html

不然你大概会一直好奇和不甘吧——家门前的那条小路,

〖JAVE经验〗考试心得:考研数据结构试题解法

相关文章:

你感兴趣的文章:

标签云: