单链表的获取第i个元素
在单链表中,由于第i个元素到底在哪?我们一开始没办法知道,必须得从第一个结点开始找。
算法思路:
1.声明一个结点p指向链表第一个结点,初始化j从1开始;
2.当j<i,就遍历链表,让p的指针向后移动,不断指向一下结点,j+1;
3.若到链表末尾p为空,则说明第i个元素不存在;
4.否则查找成功,返回结点p的数据
C语言
typedef int Status;
//可以用C语言结构指针来描述单链表:
typedef struct Node
{
ElemType data; //数据城
struct Node*Next;//指针域
}Node :
typedef struct Node* LinkList; //Node*的别名是LinkList,Node*是结构体指针
LinkList p;
Status GetElemLinkList(LinkList l,i,p,int *e)
{
char j;
p=p->Next; //指向链表的第一个元素
for (j = 1; j < i; ++j)
{
p=p->Next;
if (p==Null) //链表的长度小于i
{
return err;
}
}
e=&(p->Next);
return *e;
}
读取算法的时间复杂度取决于i的位置,最好的时间复杂度是O(1)最坏的是O(n),平均是O(n)。
其核心思想叫做“工作指针后移”,这其实也是很多算法的常用技术。