题目描述
描述:实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
输入: 1->2->3->4->5 和 k = 2
输出: 4
给定的 k 保证是有效的。
解题思路
思路1:最直观的想法是,快慢指针。构造一个头结点指向第一个结点,初始快慢指针均指向头结点。首先将快指针走k步,然后快慢指针一起走,当快指针指向空时,慢指针所指向的结点即为倒数第k个结点。注意,该题本来可能存在边界条件,即快指针还没走到k步就结束啦,但是题目中说明保证给的k均是有效的,如果没有这句话记得考虑到这个边界条件喔。
int kthToLast(ListNode* head, int k) {
ListNode *L=new ListNode(0);
L->next=head;
ListNode *p=head; //快
ListNode *q=head; //慢
// 快指针先走k步
while(p&&k>0)
{
p=p->next;
k--;
}
// 还没走到k步就结束啦
// if(k>0) //题目说保证给定的k是有效的
// 快慢指针一起走
while(p&&q)
{
p=p->next;
q=q->next;
}
// 当快指针为空则慢指针为倒数第k个
return q->val;
}
总结:一般链表题构建一个头结点比较方便喔!