已知一个带有表头结点的单链表, 假设链表只给出了头指针L。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。 函数原型为:int lnk_search(LinkList L, int k, ElemType* p_ele) 若查找成功,函数通过指针参数 p_ele 返回该结点 data 域的值,此时函数返回 1;否则,函数返回 0。相关定义如下: struct _lnklist{ ElemType data; struct _lnklist *next; }; typedef struct _lnklist Node; typedef struct _lnklist *LinkList;
时间: 2023-03-30 16:00:54 浏览: 113
可以回答这个问题。这是一个经典的链表问题,可以使用双指针法来解决。具体实现如下:
int lnk_search(LinkList L, int k, ElemType* p_ele) {
if (L == NULL || k <= ) {
return ;
}
Node *p = L, *q = L;
int i;
for (i = ; i < k && p != NULL; i++) {
p = p->next;
}
if (i < k) {
return ;
}
while (p != NULL) {
p = p->next;
q = q->next;
}
*p_ele = q->data;
return 1;
}
这个算法的时间复杂度为 O(n),其中 n 是链表的长度。
相关问题
3、已知一个带有表头结点的单链表,假设该链表只给出了头指针list。在不改变链表的
情况下,设计一个算法,查找链表中倒数第k个结点。
首先,我们需要遍历整个链表,获取链表的长度。然后,根据链表长度和k的值,求出需要遍历的结点数量n。
接着,从头结点开始,遍历n个结点,此时我们会到达第n个结点。接着再从第n个结点开始,同时从头结点也开始,同时遍历两个指针,直至第n个结点到达尾结点,此时从头结点开始的指针便是倒数第k个结点。
具体的实现过程涉及到链表的遍历和指针的移动操作。时间复杂度为O(n),空间复杂度为O(1)。
已知一个带有表头结点的单链表,结点结构如下图。假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。
算法思路:
1. 使用双指针法,让指针p和指针q同时指向表头结点。
2. 让指针q先走k步,然后让p和q同时向后移动,直到q指向空结点。
3. 当q指向空结点时,p所指向的结点就是倒数第k个结点。
4. 如果p指向的是头结点,则说明k的值大于链表长度,返回0;否则返回1并输出p所指向结点的data值。
算法实现:
```C++
int FindKthFromEnd(LinkList list, int k) {
if(list == NULL || list->next == NULL) //链表为空或只有一个头结点,返回0
return 0;
ListNode *p = list->next, *q = list->next; //初始化双指针
while(k--) { //让q先走k步
if(q == NULL) //如果k大于链表长度,返回0
return 0;
q = q->next;
}
while(q != NULL) { //让p和q同时向后移动,直到q指向空结点
p = p->next;
q = q->next;
}
if(p == list->next) //如果p指向的是头结点,说明k大于链表长度,返回0
return 0;
else {
printf("%d\n", p->data); //输出p所指向结点的data值
return 1;
}
}
```