题目:
输入一个链表,输出该链表中倒数第k个节点。从一开始计数,即链表的尾节点是倒数第一个节点。
思路:
一开始的思路很简单,遍历两次链表,第一次记录链表节点数n,第二次直接遍历n-k+1个节点就是倒数第k个节点。但如果只遍历一次的话我们也可以直接用双指针,两个指针之间距离保持在k-1,当第一个指针到达k点时,第二个指针刚好到第k个节点。这个之间我们要注意几个小细节,比如当时输入的链表头指针为null,那么整个为空,k也为空,如果链表节点数小于k,那么for循环中遍历也可能会指向null,我们就需要在for循环中加一个if判断。
代码实现:
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
if (head == NULL || k == 0) {
return NULL;
}
struct ListNode* pNode = head;
for (int i = 0; i < k - 1; ++i) {
if (pNode->next != NULL) {
pNode = pNode->next;
} else {
return NULL;
}
}
while (pNode->next != NULL) {
pNode = pNode->next;
head = head->next;
}
return head;
}