求单项链表的倒数第k个节点(只遍历一次)
单向链表求倒数第k个节点我们可以先遍历一遍找出链表的长度,再设置一个指针走(n-k)步可以找到倒数第k个节点。
但是,这需要遍历两次,如果只允许遍历一次我们就可以使用双指针。设置一个先指针和一个后指针,两个指针都指向头节点,先指针先向前走k步,之后两个指针一起向前移动,直到先指针遍历出最后一个节点值为null时,后指针指向的就是倒数第k个节点
代码c语言
typedef struct LNode{
int data;
struct LNode *next;
}
//带头节点
int find (LNode * head, int k){
LNode *p = head->next->next;
LNode *pre = head->next;
int i = 0;
While(p){
p=p->next;
i++;
if(i>k){
pre = pre->next;
}
}
if(pre == head)
return -1;
else
return pre->data;
}