查找单链表中倒数第k个位置上的结点

题目(2009统考真题):
已知一个带有表头结点的单链表,结点结构为
查找单链表中倒数第k个位置上的结点_第1张图片假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。要求:

(1) 描述算法的基本设计思想

(2) 描述算法的详细实现步骤

(3) 根据设计思想和实现步骤,采用程序设计语言描述算法(使用C或C++或JAVA语言实现),关键之处请给出简要注释。

基本设计思想 :

  • 定义两个指针变量p和q;
  • 初始时,p和q都指向链表的第一个元素结点(头结点的下一个结点);
  • p沿着链表移动,当p指针移动到第k个结点时,q指针开始与p指针同步移动;
  • 当p指针移动到最后一个结点时,q指针所指示的结点就是倒数第k个结点(p和q的距离始终为k);
  • 以上过程对链表仅进行一遍扫描,时间复杂度为O(n);

算法的详细实现步骤 :
1.int count = 0,p和q指向链表头结点的下一个结点;
2.若p为空,转第5步;
3.若count等于k,则q指向下一个结点;否则,count = count+1;
4.p指向下一个结点,转第2步;
5.若count等于k,则查找成功,输出该结点的data域的值,返回1;否则,证明k值超过了线性表的长度,查找失败,返回0;
6.算法结束;

算法实现:

typedef int ElemType;   //链表数据的类型定义;
typedef struct LNode{
    ElemType data;     //结点数据;
    ElemType LNode *link;   //结点链接指针;
}LNode,*LinkList;

int Search_k(LinkList list,int k){
    LNode *p = list->link;
    LNode *q = list->link;   //p、q指向第一个结点;
    
    int count =0;
    while(p!= NULL){ //遍历链表知道最后一个结点;
        if(count <k){
            count++; //若count
            p = p->link;
        }else{
            p = p->link;
            q = q->link;  //同步移动p、q
        }
    }
    
    if(count <k){
        return 0;  //查找失败,返回0;
    }else{
        printf("%d",q->data);
        return 1;
    }
}

你可能感兴趣的:(数据结构,算法)