题目描述
难度:
重要性:
已知带有表头结点的单链表,结点结构为(data,link)假设该链表只给了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。要求:
-
描述算法的基本思想。
-
描述算法的详细实现步骤。
-
根据设计思想和实现步骤,采用程序设计语言描述算法,关键之处请给出简要注释。
typedef int ElemType; //链表数据类型定义 typedef struct LNode{ //链表结点的结构定义 ElemType data; //结点数据 struct LNode *Link; //结点链接指针 }LNode,*LinkList; int Search_k(LinkList list,int k){ LNode *p=list->link,*q=list->link; //指针p、q指示第一个结点 int count=0; while(p!=null){ //遍历链表直到最后一个结点 if(count<k) //计数,若count<k 只移动p count++; else q=q->link; p=p->link; //之后让p、q同步移动 } if(count<k) return 0; //查找失败 返回0 else{ //查找成功 printf("%d",q->data); //打印数据并返回1 return 1; } }
非常巧妙,利用一次遍历就找到了正确结果。
先移动一个结点,等移动了k个以后,再同时移动,直到先移动的结点到尾部,后移动的结点就是结果。
感觉和小学时的一个题目很像,首先是有一个固定的数,然后知道其中一个数,就找到了另一个。