题目描述
实现一种算法,找出单向链表中倒数第k
个结点,返回该结点的值
解法一:
思路:遍历两次链表实现,第一次遍历链表是统计出链表结点的个数len
,第二次比遍历链表让自定义的结点指针从开始移动len - k +1
次,即找到了单向链表的倒数第k
个结点
代码示例:
int kthToLast(struct ListNode* head, int k){
//遍历两遍来两遍链表实现函数功能
//第一次遍历,统计单向链表中结点的个数
int len = 0;
struct ListNode* p1 = head;
struct ListNode* p2 = head;
while(p1 != NULL)
{
len++;
p1 = p1->next;
}
//第二次遍历,返回链表中第K个结点的值
for(int i = 1; i < len -k + 1; i++)
{
p2 = p2->next;
}
return p2->val;
}
解法二
思路:只对链表遍历一次,利用双指针实现,第一个指着先移动k-1次,然后两个指针一起移动,当第一个指针指向单向链表的最后一个结点时,第二个指针恰好指向了单向链表的倒数第k个结点
代码示例:
class Solution {
public:
int kthToLast(ListNode* head, int k) {
if(head == NULL || k == 0 )
return 0;
struct ListNode* p1 = head;
struct ListNode* p2 = head;
//思路:第一个指针走k-1步之后,第二个指针开始动,当第一个指针到达链表结尾时,遍历结束
for(int i = 0; i < k - 1; i++)
{
if(p1->next != NULL)
p1 = p1->next;
else
return 0;
}
while(p1->next != NULL)
{
p1 = p1->next;
p2 = p2->next;
}
return p2->val;
}
};