已知一个带有表头结点的单链表,结点结构为
data link
假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。
第一种方法:遍历一遍链表求出长度;在移动n-k步指针找到倒数第k个结点并输出数据值。
代码实现:
//定义节点类型
struct ListNote
{
ElemType data;
struct ListNote *link;
};
int FindKLast(struct ListNote *head, int k)
{
int n = 0;
//统计链表的长度
struct ListNote *p = head->link;
while(p != NULL)
{
n++;
p = p->link;
}
if(k > n)
return 0;//不存在倒数第K个结点
int offset = n-k;
p = head->link;
while(offset--)//p指针往后移动n-k步
p = p->link;
printf("%d\n",p->data);//打印倒数第k个结点的数据值
return 1;
}
第二种方法:定义快慢指针,先让fast指针移动k步,再让fast和slow指针同时移动,当fast指针为空时,此时slow指针所指的元素就是倒数第k个结点。
//定义节点类型
struct ListNote
{
ElemType data;
str