题目描述:
思路1:
可以直接暴力遍历,如果已知链表的长度,则顺序遍历的长度就已知了。
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
ListNode *p = pHead;
int size = 0;
while(p!=nullptr)
{
size++;
p=p->next;
}
ListNode *p1 = pHead;
if(size<k) return nullptr;
for(int i=1;i<=size-k;i++)
{
p1=p1->next;
}
return p1;
}
};
思路2:用栈实现
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
if(pHead==nullptr) return nullptr;
ListNode*temp = pHead;
int size=0;
stack<ListNode*> s;
s.push(temp);
while(temp!=nullptr)
{
temp=temp->next;
s.push(temp);
size++;
}
if(size<k)
return nullptr;
while(k>0)
{
s.pop();
k--;
}
return s.top();
}
};
思路3:用双指针,第1个指针先走k步后,第二个指针从头出发,此时两个指针同时走,直到第1个指针走到链表尾部,此时第二个指针走到倒数第k个节点。
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
if(pHead==nullptr) return nullptr;
ListNode*temp = pHead;
int size=0;
while(temp!=nullptr)
{
temp=temp->next;
size++;
}
if(size<k)
return nullptr;
ListNode *p1 = pHead;
ListNode *p2 = pHead;
while(k>0)
{
p1=p1->next;
k--;
}
while(p1!=nullptr)
{
p1=p1->next;
p2=p2->next;
}
return p2;
}
};