一:题目如下
已知一个带有头结点的单链表,结点结构为:,假设该链表只给出了头指针list,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出data域的值,并返回1;否则,只返回0。
二:分析步骤如下
三:结点结构如下
typedef struct Lnode {
int data;
Lnode* next;
}Lnode, * LinkList;
四:具体代码如下
(需要完整代码的同学可以关注并私信我,我私发给你~)
int Find_k(LinkList L, int k) {
if (L->next == NULL) return 0; //极端情况 链表空 直接return
Lnode* p1 = L, * p2 = L;
while (k != 0 && p1 != NULL) {
p1 = p1->next; //第一步① p1先走k步
k--;
}
if (p1 == NULL) return 0; //另一种情况 链表长度小于k 直接return
while (p1 != NULL) {
p1 = p1->next;
p2 = p2->next; //第二步② p1,p2同时往后走,直至p1=NULL,此时p2指向倒数第k个结点
}
cout << p2->data << endl;
return 1;
}
五:运行结果如下
①正常情况,求倒数第三个结点
②链表为空,输出0
③链表长度小于k,输出0
如代码有问题,欢迎大家评论或者私信我~,学长会进行相应的更正!