💓 博客主页:C-SDN花园GGbond
⏩ 文章专栏:数据结构经典题目刨析(c语言)
一.题目描述
二.解题思路
方法一:计数器方式
- 先遍历链表,求出链表长度count
- 倒数第k个节点,就是正数第count-k+1个节点(下标为count-k)
- 再次遍历链表,找到该节点,返回数据
- 先遍历链表,求出链表长度count
- 倒数第k个节点,就是正数第count-k+1个节点(下标为count-k)
- 再次遍历链表,找到该节点,返回数据
方法二:双指针方式
- 最多遍历一次链表
- 时间复杂度 O (n)
- 空间复杂度 O(1)
- 定义两个指针slow和fast,初始都指向第一个节点
- 初始fast指针先走k步
- 然后slow指针和fast指针每次各走一步,当fast指针指向空时,slow指针所指向的节点就是倒数第k个节点
- 返回该节点的数据
1.快慢指针初始位置
2.快指针先走k步
3.快指针走到NULL,慢指针走到倒数第k个节点
三、C语言代码实现
方法一:计数器方式
//返回单链表的倒数第 k 个节点
struct ListNode {
int val;
struct ListNode* next;
};
typedef struct ListNode ListNode;
//方式一 计数器方式
int kthToLast1(struct ListNode* head, int k)
{
ListNode* pcur = head;//遍历节点的指针
int count = 0;
while (pcur)//求出链表长度
{
pcur = pcur->next;
count++;
}
pcur = head;
count = count - k;
while (count--)//找到该节点
{
pcur = pcur->next;
}
return pcur->val;
}
方法二:双指针方式
//方式二 快慢指针方式
int kthToLast2(struct ListNode* head, int k)
{
ListNode* slow = head, * fast = head;
while (k--)//快指针先走k步
{
fast = fast->next;
}
while (fast)
{
fast = fast->next;
slow = slow->next;
}
return slow->val;
}