头歌实训:删除链表倒数第 N 个结点
文章目录
- 任务描述
- 示例 1:
- 输入:head = [1,2,3,4,5], k = 2
- 输出:[1,2,3,5]
- 示例 2:
- 输入:head = [1], k = 1
- 输出:[]
- 示例 3:
- 输入:head = [1,2], k = 1
- 输出:[1]
- 编程要求
- 测试说明
- 源代码:
任务描述
本关任务:给你一个链表,删除链表的倒数第 k 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], k = 1
输出:[]
示例 3:
输入:head = [1,2], k = 1
输出:[1]
编程要求
根据提示,在右侧编辑器补充代码,删除不带附加头节点的单链表head中倒数第k个结点。
测试说明
平台会对你编写的代码进行测试:
输入包括一行,如示例所示。
测试输入1:
1 2 3 4 5
2
预期输出1:
1 2 3 5
测试输入2:
1
1
预期输出2:
``
测试输入3:
1 2
1
预期输出3:
1
提示:
数据范围:
0<=链表节点值<=1000
1<=链表长度<=1000
1<=k<=链表长度
开始你的任务吧,祝你成功!
源代码:
#include "linklist.h" /* 单链表类型声明及其基本操作 *//**typedef struct LNode
*{
* int data;
* struct LNode *next; //指向后继结点
*} LinkNode, ListNode; //声明单链表结点类型
*//*** head:不带附加头结点的单链表的头指针* k:倒数第k个结点* 返回值:返回删除倒数第k个结点后的单链表的头指针*/
ListNode* deleteNode(ListNode* head, int k) {//请在下面编写代码/********************Begin********************/int cnt = 0; //cnt记录链表结点个数ListNode *p = head; //指针p用于循环遍历while(p){cnt++;p = p->next;}p = head; //重置p指针,通过for循环找到第倒数k个结点的前驱结点for(int i = 1; i < cnt - k; i++){p = p->next;}if(cnt == k) //当为第一个结点时直接删除{head = head->next;free(p);}else{ //否则进行删除ListNode *q = p->next;p->next = q->next;free(q);}return head;//返回删除后的头结点/*********************End*********************/
}