题目描述
输入一个链表,输出该链表中倒数第k个结点。
要求
只进行一次遍历
思路
用双指针的思路,第一个指针用来遍历链表,第二个指针是从第一个指针倒数第K个节点。因此首先从第一个指针开始遍历,遍历到第k-1个节点时(这里考虑特殊情况,链表指针长度不够的情况返回nullptr),则第二个指针从头节点开始遍历,当第一指针到达尾节点时,第二个指针也到达倒数第K个节点。
代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (pListHead ==nullptr) return nullptr;
if (k==0) return nullptr;
ListNode* pfast = pListHead;
for(int i=0;i<int(k-1);i++)
{
if(pfast->next == nullptr) return nullptr;//链表长度不够
else pfast = pfast->next;
}
ListNode* plow = pListHead;
while(pfast->next!=nullptr)
{
pfast = pfast->next;
plow = plow->next;
}
return plow;
}
};
举一反三
Leetcode 19 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
思路如上所述
代码
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* end = head;
ListNode* cur = head;
for(int i = 1;i <= n;i++){
end = end->next;
}
if(end == NULL)return head->next;
while(end->next){
end = end->next;
cur = cur->next;
}
cur->next = cur->next->next;
return head;
}