LeetCode 剑指 Offer 22. 链表中倒数第k个节点 (C语言)
一. 题目
二. 思路
有两种思路:
1. 先遍历一遍列表,得到整个链表的长度,然后算出倒数第k个元素是正着数第一个元素,然后该结点即可,代码包含两次循环
2. 设置两个指针,先让第一个指针往前走,当第一个指针走过k个距离之后,第二个指针开始走,这样当第一个指针走到尾结点时,第二个指针刚好走到倒数第k个结点,返回该结点即可,代码只有一次循环,速度更快
三. 代码
代码1:
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
int cnt = 0;
struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *p_new = (struct ListNode*)malloc(sizeof(struct ListNode));
p = NULL;
p_new = NULL;
p = head;
while (p) {
cnt ++;
p = p->next;
}
p_new = head;
for (int i = 1; i <= cnt; i ++ ) {
if(i == cnt-k+1) {
return p_new;
}
p_new = p_new->next;
}
return;
}
代码2:
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
int cnt = 0;
struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *pf = (struct ListNode*)malloc(sizeof(struct ListNode));
p = head;
pf = head;
while (pf) {
pf = pf->next;
if (cnt >= k) {
p = p->next;
}
cnt ++;
}
return p;
}
代码2执行结果