牛客-链表中倒数第k个节点
思路1:
- 设链表的长度为len
- 倒数第k个就是正数第len-k+1个
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (pListHead==NULL) {
return NULL;
}
int len=0;
ListNode *p = pListHead;
while(p!=NULL) {
len++;
p=p->next;
}
if(k>len) {
return NULL;
}
int i=len-k;
ListNode *q = pListHead;
while(i>0) {
i--;
q=q->next;
}
return q;
}
思路2:
- 让p指针先走k-1步
- 然后q和p指针同步走,知道p走到尽头,那么q指向的就是倒数第k个节点
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (pListHead==NULL || k<=0) {
return NULL;
}
ListNode *p = pListHead;
ListNode *q = pListHead;
while((k-1)>0) {
k--;
if(p->next == NULL) {
return NULL;
}
p=p->next;
}
while(p->next!=NULL) {
p=p->next;
q=q->next;
}
return q;
}