题目描述:有一个带头结点的单链表L,请设计一个算法查找其第i个结点位置,若存在则返回指向该给点的指针,若不存在则返回NULL。
算法思想:
输入检查:若链表为空(仅有头结点)或i ≤ 0,直接返回NULL。
遍历链表:从头结点后的第一个结点开始,依次向后遍历,直到找到第i个结点或链表结束。
返回结果:若找到第i个结点,返回指向该结点的指针;否则返回NULL。
复杂度分析:
时间复杂度:O(n)空间复杂度:O(1)
cpp
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data; // 数据域
struct LNode *next; // 指针域
} LNode, *LinkList;
// 查找第i个结点
LNode* GetElem(LinkList L, int i) {
if (L == NULL || i <= 0) {
return NULL; // 输入不合法
}
LNode *p = L->next; // p指向第一个实际结点(跳过头结点)
int count = 1; // 计数器从1开始
while (p != NULL && count < i) {
p = p->next; // 指针后移
count++; // 计数器递增
}
return p; // 若找到则返回p,否则返回NULL
}