题目
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
数据范围:0≤n≤,0≤ai≤,0≤k≤
要求:空间复杂度O(n),时间复杂度O(n)
进阶:空间复杂度O(1),时间复杂度O(n)
解析
本题最开始的思路是:直接输出倒数第k个结点。但是直接以从前向后的形式是无法直接输出倒数第k个结点的。因此可以采用先计算出链表的总长度n,然后将前n-k个结点的空间释放掉,将头结点指向倒数第k个结点,然后输出头结点。
用这样的步骤,就可以完成输出倒数第k个结点的目的。
注意:先保存当前结点指针再删除。
代码
struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) {
struct ListNode* p = pHead;
struct ListNode* t = pHead;
struct ListNode* temp;
struct ListNode* save;
int count = 0;
int ListLength = 0;
if(pHead == NULL) //如果头节点指向空,则返回头结点
return pHead;
while(p != NULL){ //若p不为空
ListLength++; //统计链表的长度
p = p->next; //逐一遍历
}
if(k > ListLength){ //如果k值大于链表结点数,就返回NULL
return NULL;
}
ListLength = ListLength-k; //倒数第k个节点的前一个结点
while(count != ListLength){ //当还没遍历到第k个结点时
count++; //计数器+1
save = t; //将当前结点存入save
t = t->next; //将t指向后继
free(save); //释放结点
} //即将倒数第k个结点前的所有结点都释放
pHead = t; //将头结点指向t
return pHead;
}