给定一个带有表头节点的单链表,要求在不改变链表的结构下找到链表中倒数k个位置的节点,查找成功输出该节点的值并返回1,否则返回0
思路
方法一:
第一次遍历确定链表的长度l,第二次遍历找到l-k+1个位置的节点(不推荐,时间复杂度高,遍历两次)
方法二:
借助一个辅助空间,遍历一次将所有节点的data域的数据存入辅助空间中,通过随机读取的方式来读取第k个数据
(不推荐,空间复杂度高)
方法三:
双指针法
- 通过两个指针,之间间隔k个节点,然后一起变量,在后一个指针遍历到链尾的时候,前一个指针的位置刚好是倒数第k个位置的节点
(强力推荐,空间时间复杂度低)
typedef struct strut Lnode{
Elemtype data;
struct Lnode *next;
}LNode;
int serachK(Linklist list,int k){
LNode *p=list->next,*q;
While(p!=NULL){
int count =0; //p先向后移动k个位置然后,p,q一起移动
if(count < k)count++;
else q=q->next;
p=p->next;
}
//判断结果
if(count < k)
return 0;
else
printf(“%d”,p->data);
return 1;
}