标签:count 结点 单链 LNode int next 链表 倒数第
题目
已知一个带有表头结点的单链表,结点结构为
data | link |
---|
在不改变链表的前提下,设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点。若查找成功,算法输出该结点的data
域的值,并返回1,否则,只返回0。
分析
解决这个题目的方法有很多种:
- 采用两遍或多遍扫描链表,先得到链表长度,再顺序扫描到L−K位置;
- 采用递归算法,在递归返回位置计数,计到k位置;
- 辅助数组;
但上述这些方法都不是最优的,我们可以定义两个指针*p, *q
,*p
和*q
之间间隔k
个结点,且*p
在前*q
在后,当*q
指向尾结点时,由于*p, *q
间隔k
个结点,所以*p
指向的节点就是倒数第k
个结点,因此可以先将*q
向后移动k
个位置,再将*p, *q
同时向后移动,直至*q
移动到尾结点处。以上过程,只需扫描一遍链表,为最有算法。
代码
#include<iostream>
#include<stdio.h>
using namespace std;
struct LNode{
int data;
LNode *next;
};
int BackLocate(LNode L, int k){
LNode *p, *q;
int count = 0;
p = q = L.next;
while(q != NULL){
count++;
if(count > k)
p = p->next;
q = q->next;
}
if(k > count) //当K大于链表长度时,返回-1
return -1;
return p->data;
}
int main(){
int a[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
LNode L, *r;
r = NULL;
for(int i=0; i<10; i++){ //尾插法建立链表
LNode *p;
p = new LNode;
p->data = a[i];
if(r == NULL){
L.next = p;
r = p;
}
else{
r->next = p;
r = p;
}
}
r->next = NULL;
printf("%d\n", BackLocate(L, 3));
}
标签:count,结点,单链,LNode,int,next,链表,倒数第 来源: https://blog.csdn.net/qq_40941722/article/details/94389509
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。