题目来源: 计算机考研408真题2009年42题
题目描述:
- 描述: 42.(15分)已知一个带有表头结点的单链表,结点结构为| data | link |,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。要求:
l)描述算法的基本设计思想。
2)描述算法的详细实现步骤。
3)根据设计思想和实现步骤,采用程序设计语言(C、C++或Java语言实现)描述算法,关键之处请给出简要注释。
思路
- 定义两个指针变量p和q,初始时均指向头结点的下一个结点(链表的第一个结点)。
- p指针沿链表移动,当p指针移动到第k个结点时,q指针开始与p指针同步移动;
- 当p指针移动到最后一个结点时,q指针所指示结点为倒数第k个结点。
具体实现:
class MyNode{
int data;
MyNode link;
MyNode(int data,MyNode node){
this.data = data;
this.link = node; //结点指针
}
int Search(MyNode list,int k){ //查询方法
MyNode p = list.link,q=list.link; //指针p与q都指向第一个结点
int count = 0;
while(p!=null){ //遍历链表直到最后一个结点
if(count < k) { //计数,若count<k只移动p
count++;
p = p.link;
}else{ //之后让p、q同步移动
q = q.link;
p = p.link;
}
}
if(count < k){
return 0; //查找失败返回0
}else{
System.out.println(q.data);
return 1; //否则打印并返回1
}
}
}
public class day408_09 { //进行测试
public static void main(String[] args) {
MyNode head = new MyNode(Integer.MAX_VALUE,null);
for(int i = 0;i < 5;i ++){
MyNode node = new MyNode(i,null);
if(head.link!=null){
node.link = head.link;
head.link = node;
}else{
head.link = node;
}
}
//测试
head.Search(head,2);
}
}
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情”