day44 计算机考研408真题2009年42题(Java)

297 阅读2分钟

题目来源: 计算机考研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 天,点击查看活动详情