思路:只需遍历一次单链表,维护两个指针p和q,初始时均指向头结点。p先移动k-1步,然后p和q同时移动直至p指向尾结点,此时q所指的结点即倒数第K个结点
代码:
typedef struct node{
int data;
struct node * next;
} Node;
Node * process(Node * L, int k){
assert(L != NULL);
Node * p = L, * q = L; //p在前,q在后
for(int i = 0; i < k-1; i++) //p先向后移动k-1步(注意不是k步)
p = p->next;
while(p->next != NULL){ //然后q和p一起移动,直至p移动至尾结点
p = p->next;
q = q->next;
}
return q;
}