前言
声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出数据结构每日一题
题目
给定一个带有表头节点的单链表list,要求在不改变链表的结构下找到链表中倒数k个位置的节点,查找成功输出该节点的值并返回1,否则返回0
思路
方法一:
第一次遍历确定链表的长度l,第二次遍历找到l-k+1个位置的节点
(不推荐,时间复杂度高,遍历两次)
方法二:
借助一个辅助空间,遍历一次将所有节点的data域的数据存入辅助空间中,通过随机读取的方式来读取第k个数据
(不推荐,空间复杂度高)
方法三:
双指针法
- 通过两个指针,之间间隔k个节点,然后一起变量,在后一个指针遍历到链尾的时候,前一个指针的位置刚好是倒数第k个位置的节点
2.读取第一个指针的数据就是要求的数据
(强力推荐,空间时间复杂度低)
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;
}
常见的散列函数
- 除留余数法
- 直接定值法
- 数字分析法
- 平方取中法
- 分段叠加法
- 伪随机数法
哈希查找的解决冲突办法
- 链地址法
- 开放定址法
线性探测法
平方探测法
伪随机法