思路1:记录链表长度,再用长度减去k,得到移动的步数,遍历到那返回即可
思路2:将结点放入vector中,然后翻转,直接返回第k-1个元素即可(注意下标越界)
思路3:采用双指针,让p2先走k步,然后p1,p2同时走,返回p1即可(注意while(k--)之后k会变成-1),如果k不为-1,则p2还没走完k步就到尾巴了,则返回NULL
思路4:使用栈来存储(和思路2一样),然后从栈顶开始取第k个结点即可(注意特殊情况,k==0)
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
ListNode* p1=pHead;
int len=0;
while(p1)
{
len++;
p1=p1->next;
}
if(len>=k)
{
int x=len-k;
p1=pHead;
while(x--)
{
p1=p1->next;
}
return p1;
}
else
return NULL;
}
};
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
vector<ListNode*> myarray;
ListNode* p1=pHead;
int len=0;
while(p1)
{
myarray.push_back(p1);
p1=p1->next;
len++;
}
if(len>=k&&k!=0)
{
reverse(myarray.begin(),myarray.end());
return myarray[k-1];
}
else
return NULL;
}
};
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
ListNode* p1=pHead;
ListNode* p2=pHead;
while(k--&&p2)
{
p2=p2->next;
}
if(k!=-1)
return NULL;
while(p2)
{
p1=p1->next;
p2=p2->next;
pHead=p1;
}
return p1;
}
};
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
stack<ListNode*> mystack;
ListNode* p1=pHead;
int len=0;
while(p1)
{
mystack.push(p1);
p1=p1->next;
len++;
}
if(len>=k&&k!=0)
{
while(k--)
{
pHead=mystack.top();
mystack.pop();
}
return pHead;
}
else
return NULL;
}
};